ontology-atlas
Ontology Atlas exposes a local-first MCP server for managing an atlas/ Markdown ontology vault, querying its graph, analyzing codebases, and reviewing safe writes.
Inspect the active vault/repo roots and retrieve server guide topics.
Read ontology concepts, relations, neighbors, paths, backlinks, orphans, kinds, and typed filtered queries.
Compile the vault into a deterministic graph artifact and validate vault integrity, path drift, and wiki pages.
Run graph analysis: centrality, communities, impact/blast radius, reachability, subgraphs, cycles, topological order, domain/project maps, health, and agent briefs.
Inspect local Git status/history read-only, and create vault-scoped Git checkpoints with dry-run/confirm safety.
Write and manage ontology nodes: add, batch add, patch, rename, reclassify, merge, delete, absorb documents, and add/remove/replace typed relations.
Analyze code repositories to propose ontology candidates, infer imports, inspect architecture conformance, and index project structure without auto-writing semantic relations.
Bind/unbind project source folders and finalize project meaning with provenance receipts.
Read raw source documents (DOCX, XLSX, CSV, HTML, text, PDF) and validate generated wiki pages against their contract.
Enforce local-first operation, read-only defaults, dry-run/confirm patterns, and
expected_mtimeconflict guards for writes.
Provides tools for interacting with local Git repositories, including reading vault-scoped commit history, inspecting Git status, and creating vault-scoped Git checkpoints (snapshots) without pushing.
Enables exporting the compiled ontology graph as JSON-LD or GraphML, which can be opened in Neo4j for graph database analysis and visualization.
Ontology Atlas

Folder walks admit up to 100,000 tracked entries and report truncation beyond that ceiling or depth 12; this is a capacity bound, not a frame-rate guarantee.
In 30 seconds
What | An |
For your agent | Typed task context over MCP: capabilities, code anchors, declared dependencies, evidence, and unknowns. |
For you | The same records on a map, in documents, and as Git diffs, so you decide which meaning changes to keep. |
Honest by design | A graph path is a declared relationship, not proof of runtime impact. Missing evidence shows as unknown, never as safe. |
your-repo/
├── src/
└── atlas/ ← the whole ontology, cloned, branched and reviewed with the code
├── project.md
├── domains/ capabilities/ elements/
├── sources/ documents kept exactly as they arrived
└── wiki/ pages written from those sources, every fact citedRelated MCP server: 50 First Tapes MCP Server
See it
How it works
Open a folder — the app reads Markdown in place, or starts
atlas/from your code. The path is shown before anything is written.Connect your agent — one button writes the MCP config; a restart and
mcp-verifyprove the connection is live.Ask for context —
query_ontologywithoperation: "agent_brief"gives the agent a bounded brief for its task.Review the meaning — proposed changes arrive as Markdown diffs; you keep, correct, or reject them in Git.
Definition previews preserve complete introductory text; the full document retains exclusions and uncertainties. Local code inspections show the connected folder and offer native permission recovery before reading.
$ node $ATLAS blast-radius capabilities/mcp-tool-server docs/ontology --depth 2
capabilities/mcp-tool-server — blast radius (depth 2, incoming)
risk unknown · 1 node · 1 relation · 0 cross-domain---
uid: 71890f3e-7b5d-4c0a-8f14-123456789abc # permanent identity, kept through renames
slug: capabilities/token-issue
kind: capability
title: Token issue
domain: domains/auth
path: src/auth/token-service.ts # a path — code evidence
elements:
- elements/jwt-signer # a slug — an implementation-role node
dependencies:
- capabilities/session-refresh # a slug — another node
---
Issues access and refresh tokens for authenticated users.A path points at code; a slug points at a node. dependencies are directed and
relates is symmetric, so the map never turns similarity into causality. Only
files with kind: join the graph; sources/** and wiki/** pages do not.
Full contracts: what becomes a node? ·
relations ·
vault specification.
Principles
Local-first | Not a… |
Your disk is the database; Git is the history. | general-purpose ontology editor |
No Atlas backend, account, or telemetry. | code index or IDE |
Model and provider transfers are opt-in and logged in | automatic acceptance of generated knowledge |
MCP and CLI read the folder directly, even with the app closed. | RDF/OWL/SHACL implementation (§5.2) |
Extensions are files a | service, and not on npm |
Measured, honestly: our first benchmark mostly tested vocabulary only Atlas knew. Re-scored, we have not yet measured a difference in answer quality, and Atlas was slower. The correction · benchmark log.
Status — read this before installing
The download page is the release authority: tag, sizes, checksums, and signing state. GitHub Releases is the second source.
macOS is Developer ID signed and notarized, with the MCP server inside the bundle.
Windows x64 is an unsigned beta — SmartScreen may warn, and a managed PC may refuse it. See Security.
Linux and others run the browser app, or the CLI and MCP server from a source checkout.
Every release is a plain version; the in-app updater verifies each archive's signature before installing.
Documentation
Use it: hosted guide · features · MCP setup · CLI reference Model a vault: what becomes a node? · relations · specification · quality authority map Understand it: product direction · architecture · security · decisions
Contributing
Issues and pull requests are welcome; the most useful report points Atlas at a
real repository and shows where it falls short. Read
CONTRIBUTING.md first (external pull requests come from
forks), and AGENTS.md is canonical for people and agents alike.
Start with pnpm checks:changed -- --run; land with pnpm pr:land <number>.
Command | What it answers |
| Each harness's instruction integrity; independent Codex and Claude files need not match |
| Current task records and concurrent-state conflicts; append a UUID record per worktree observation (guide) |
| Land several branches as one: plan the merge (which carry work, shared files, trial conflicts) and afterwards prune the component branches main provably contains. See |
| Which gates this change actually needs |
| Which open pull requests (and |
| The decision record to cite or overturn, and whether this change owes one |
| A new living document from its template in |
| Docs gates, including |
| Whether every living document carries its kind, status and area with pointers that resolve; one document's commits across moves, which is its version |
| Moves the documents listed in |
| Rewrites the per-file weights that balance the browser shards from downloaded |
| A change may not add a fixed |
| Which CI checks ever failed, per distinct run, from the lane reports |
| Re-shoots the six app screens the download page shows, Korean and English ( |
| Dead files, exports and types across every scope |
| Shared harness lessons that are open or verified but not yet fixed; record and review them with |
| Compose the ignored |
| Whether the MCP server keeps memory it should release: heap after two forced collections across 50 repeated calls per tool and across moved Git HEADs, on a generated vault; about a minute, kept out of pre-push |
| Fire CI on a draft now, so a green, disjoint change can take the fast path |
| Dry-run what a landing would do without writing to GitHub, and run trains until the queue is empty |
| Queue a pull request for the landing train (or merge it on the fast path), and show the queue and the train in flight |
| Types across every file, with Next's generated route and page types, so the browser build need not check them again |
Rows stay sorted by command, and the reference's entries by area, so two
branches that each add one land on different lines; pnpm dev-checks:check
names the line to move and -- --fix sorts both.
Development checks is the full gate reference, one
entry per area; map testability owns canvas
performance, readability, contrast, and instrumentation.
License
Available Tools
40 toolsabsorb_documentADestructive
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: documentnodes with arole: policyfrontmatter 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:
Without confirm: true the call is a dry-run — returns the classification plan per section, no writes.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Actually write when true. Omit or false for a dry-run (plan only, no writes). | |
| filePath | Yes | Path to the CLAUDE.md/AGENTS.md-style markdown file to absorb (absolute, or relative to the MCP server cwd). | |
| allowOutsideRepo | No | Explicit destructive opt-in required only when filePath resolves outside repoRoot. Dry-run reports outsideRepo and keeps canConfirm:false without it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| title | No | |
| dryRun | Yes | |
| changed | No | |
| message | Yes | |
| summary | Yes | |
| written | No | |
| filePath | Yes | |
| sections | Yes | |
| backupPath | No | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| outsideRepo | Yes | |
| sourceLabel | Yes | |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
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.
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.
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.
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.
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.
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.
add_conceptA
Create a new ontology node (.md file). Call when an AI agent finds a new capability / element / project from code analysis. Throws if the slug already exists — use patch_concept in that case. The frontmatter is normalized per kind (project gets domains/capabilities/elements empty arrays; capability gets elements: []; capability/element should also set domain: so the tree has a parent — missing extras come back as warnings in the response, not as an error. If another node already has the same title, a near-duplicate warning is included too — prefer patch_concept on the existing node over forking a duplicate. Successful writes return compact postWriteMaintenance (maintenance_plan) with count-safe byPhase / bySeverity / byKind queue buckets, action score, executable proposedAction, and current-page nextExecutableAction / nextReviewAction pointers so agents can immediately see graph cleanup / relation suggestions after the new node lands. For bulk creation (e.g. bootstrap flow with 5+ nodes) use add_concepts({concepts: [...]}) (batch, max 50, partial result) — saves K-1 round-trips. When kind is element: an element names a CONCEPT a capability uses (e.g. "jwt-token"), not a file. If your title is a bare path or ends in a source extension, you are describing evidence, not the concept — rename title to the role and put the path in path:, or if 3+ siblings under the same parent already look like this, call get_concept on the parent and consider patch_concept on an existing sibling instead of adding another file-mirror node. The same rule binds the slug: flat under the kind folder (elements/<role-name>), never a code path (elements/src/views/home is rejected) — path-style slugs collide the moment two files share a basename and the graph silently merges distinct nodes.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown body (optional). When omitted a kind-specific starter body is written so the file is self-explanatory in the editor. | |
| kind | Yes | project / domain / capability / element / document. (vault-readme is reserved for the auto-generated README.md and should not be set by agents.) | |
| path | No | One canonical implementation entrypoint for a capability or element (repo-relative file or directory). Preserved as evidence and checked by validate_vault path drift. | |
| slug | Yes | Vault-relative slug (omit the .md extension), flat under the kind folder — e.g. "elements/jwt-token", "capabilities/token-issue". A slug is the node's name, never a code path: "elements/src/views/home" is rejected (put the file location in path: instead). | |
| title | Yes | Display title for the node. | |
| domain | No | Parent domain slug. Strongly expected for kind=capability and kind=element — without it the node floats orphaned in the tree. | |
| labels | No | Per-locale display names, e.g. { "ko": "결제", "en": "Payments" }. Written as `display_ko` / `display_en` frontmatter keys; `title` stays the single source for search/matching. Fill BOTH locales the vault serves — a single-locale entry comes back as a warning. | |
| elements | No | Element slugs this node uses (project / capability). | |
| capabilities | No | Capability slugs this node owns (project / domain). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| slug | Yes | |
| changed | Yes | |
| filePath | Yes | |
| warnings | No | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=false, but the description goes far beyond that: it discloses that duplicate slugs throw, frontmatter is normalized per kind, missing extras and near-duplicate titles come back as warnings rather than errors, and successful writes return a detailed postWriteMaintenance payload. This rich behavioral detail is independent of and complementary to the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the tool is complex and the length is generally earned. It front-loads the core action and error condition, then proceeds through normalization, warnings, response shape, bulk usage, and naming constraints. There is some redundancy between the title-role rule and the slug rule, and the response details could be trimmed, but it remains logically organized and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with an output schema, the description is unusually complete: it covers when to use it, when not to, duplicate handling, warning behavior, response contents, bulk alternative, parent/domain expectations, and naming rejection rules. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful context on top: slug must be flat under the kind folder and never a code path, capability/element should set domain, and title should name a role rather than a file path. This goes beyond the schema's field descriptions, though it does not deepen every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a new ontology node (.md file).' It immediately distinguishes add_concept from its siblings by naming patch_concept for existing slugs and add_concepts for bulk creation. This makes the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call the tool ('Call when an AI agent finds a new capability / element / project from code analysis') and gives concrete alternatives: use patch_concept when the slug already exists or when a near-duplicate title is found, and use add_concepts for batch creation. This is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_conceptsA
Batch-create multiple nodes in one call — same per-row shape as add_concept. Use after analyze_repo_structure or another reviewed proposal flow when the agent has K accepted candidates from the user — replaces K×add_concept round-trips. Each row is processed independently: existing-slug / invalid-kind / missing-required-fields / non-object row shape / unknown row fields surface as { slug, ok: false, error } rows whose errors include a concepts[n] row label, single unknown-field rows include receivedField plus one-row unknownFields, multi unknown-field rows report every unknown field with nearest hints and Received fields: ..., and duplicate input slugs report the later concepts[n] row plus first-seen concepts[m] with structured rowName / firstSeenAt; the rest still land. A row whose normalized title matches an earlier landed row in the same batch still lands but carries a near-duplicate warning — patch_concept the earlier node instead of forking the same concept (duplicates are the #1 growing-vault failure mode). concepts[] order in the response matches the input. Cap = 50 per call (split into multiple batches for larger sets). NO atomic rollback — if you need all-or-nothing semantics use single add_concept calls. Invalid-only batches return no row-level write metadata and no top-level postWriteMaintenance. When at least one row changes the vault, the response includes one compact postWriteMaintenance (maintenance_plan) with count-safe byPhase / bySeverity / byKind queue buckets, action score, executable proposedAction, and current-page nextExecutableAction / nextReviewAction pointers for the final graph. Rows whose title is a bare file path follow the same rule as add_concept above. Prefer one capability node covering a directory plus a short elements: list over one row per file, unless each file's role differs in a stated sentence.
| Name | Required | Description | Default |
|---|---|---|---|
| concepts | Yes | Array of concept specs (max 50). Each row uses the same shape as `add_concept` input. |
Output Schema
| Name | Required | Description |
|---|---|---|
| concepts | Yes | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations (which are sparse: readOnlyHint=false etc.) by disclosing: per-row independent processing, error row shapes (including field-level details like `receivedField` and `unknownFields`), handling of duplicate slugs, near-duplicate detection with warnings, response order, the 50-cap, no atomic rollback, and the presence of `postWriteMaintenance` when at least one row changes the vault. It even provides domain-specific warnings (duplicates are the #1 failure mode). This level of disclosure is exceptional and far exceeds the annotations' minimal hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence serves a purpose: it defines scope, usage, error handling, batch limit, atomicity, and maintenance output. It is front-loaded with the core purpose and alternates. However, it is arguably dense and could be trimmed, but for a complex batch operation, the length is justified and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the output schema, and the 1-parameter schema that is fully documented, the description covers everything an agent needs: when to use, error handling, batch limits, post-write maintenance, and even best practices for grouping nodes. There is no significant missing guidance for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of the parameter (`concepts` with nested objects) and includes a description for the array indicating it uses the same shape as `add_concept` input. The tool description doesn't re-describe the parameters but does add context about row-level error handling and warns about `elements` and `labels` (e.g., fill both locales). Since schema coverage is high, baseline is 3, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb-resource pair: 'Batch-create multiple nodes in one call' and immediately contrasts with the single-node `add_concept`. It specifies the exact use case (after `analyze_repo_structure` or similar) and the interface (same per-row shape as `add_concept`), distinguishing it from siblings. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Use after `analyze_repo_structure` or another reviewed proposal flow when the agent has K accepted candidates.' It also gives the alternative: 'replaces K×`add_concept` round-trips' and provides exclusions: 'if you need all-or-nothing semantics use single `add_concept` calls' and 'split into multiple batches for larger sets.' This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_relationAIdempotent
Add a semantic relation between two nodes. Appends to the matching frontmatter graph key (domains / capabilities / elements / dependencies / relates / contains / describes); domain sets the source node's inline parent domain. The relation type picks which key receives the entry. A new depends_on relation requires a nonblank why; an already-existing edge remains an idempotent read even if legacy data has no rationale. R11: optional expected_mtime — pass the source-side mtime from a prior get_concept so concurrent external edits throw VaultConflictError. Invalid relation type is rejected before endpoint slug resolution with a closest-value hint and structured valueName / receivedValue / suggestion / allowedValues repair fields in structuredContent, with no changed, alreadyExists, or postWriteMaintenance write metadata. Changed writes return compact postWriteMaintenance (maintenance_plan) with count-safe byPhase / bySeverity / byKind queue buckets, action score, executable proposedAction, and current-page nextExecutableAction / nextReviewAction pointers so agents can immediately see graph cleanup / relation suggestions after the edge lands. For multiple already-approved semantic edges use add_relations({relations: [...]}) (batch, idempotent, max 50). infer_imports.moduleEdges require exact-evidence review, a semantic rationale, and human approval first.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target slug. | |
| why | No | 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. | |
| from | Yes | Source slug. | |
| type | Yes | Relation type. | |
| expected_mtime | No | Optional conflict guard for the source slug. If the source mtimeMs differs at write time, the call throws. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| to | Yes | |
| key | No | |
| from | Yes | |
| type | Yes | |
| changed | No | |
| alreadyExists | No | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (idempotentHint=true, readOnlyHint=false): it discloses idempotent-read behavior for existing edges, the VaultConflictError thrown by expected_mtime, rejection of invalid type before endpoint slug resolution, the structuredContent repair fields, and the postWriteMaintenance shape returned on changed writes. Consistent with annotations — no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, but the description is very long and reproduces a substantial amount of output-schema detail (structuredContent repair field names, maintenance_plan bucket names like byPhase/bySeverity/byKind, nextExecutableAction pointers) that an output schema already carries. Information-dense with no fluff, yet over-specified for a selection/invocation description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation tool with an output schema, the description is remarkably complete: it covers frontmatter write semantics, idempotency, conflict handling, error repair metadata, and the sibling batch alternative. It doesn't need to explain return values since output schema exists. Slight redundancy with the schema keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real workflow meaning: it explains that the type parameter picks which frontmatter key receives the entry, that `domain` sets the inline parent domain, that depends_on requires a nonblank why, and that expected_mtime should carry the prior get_concept mtime. This is value beyond the schema's literal field definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Add a semantic relation between two nodes') and immediately explains the mechanism (appending to the matching frontmatter graph key). It differentiates from the sibling add_relations by naming the batch alternative explicitly, and the semantics are clearly distinct from remove_relation/replace_relation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance: 'For multiple already-approved semantic edges use add_relations({relations: [...]})' and flags that infer_imports.moduleEdges require exact-evidence review, semantic rationale, and human approval first. The expected_mtime guidance (pass source-side mtime from a prior get_concept) tells agents exactly when and how to use the conflict guard.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_relationsAIdempotent
Batch-add multiple relations in one call — same per-row shape as add_relation. Use after analyze_repo_structure or another review flow when the agent has K semantic edges accepted by the user — replaces K×add_relation round-trips. Inferred module edges are not accepted merely because imports exist; review exact evidence and include the required nonblank why for every new depends_on. Each row is processed independently and idempotently: existing edges return {ok: true, alreadyExists: true}; missing source/target slugs / unknown type / non-object row shape / unknown row fields surface as {ok: false, error} with a relations[n] row label and structured rowName; unknown type rows include a closest-value hint with structured valueName / receivedValue / suggestion / allowedValues; single unknown-field rows include receivedField plus one-row unknownFields; multi unknown-field rows report every unknown field with nearest hints, allowedFields, receivedFields, and Received fields: .... relations[] order in the response matches the input. Cap = 50 per call. NO atomic rollback — for all-or-nothing semantics use single add_relation calls. Tip: avoid expected_mtime in batch when multiple rows share the same from slug — the first row mutates that file so the second would see a stale mtime. Invalid-only batches return no row-level changed / alreadyExists write metadata and no top-level postWriteMaintenance. When at least one row changes the vault, the response includes one compact postWriteMaintenance (maintenance_plan) with count-safe byPhase / bySeverity / byKind queue buckets, action score, executable proposedAction, and current-page nextExecutableAction / nextReviewAction pointers for the final graph.
| Name | Required | Description | Default |
|---|---|---|---|
| relations | Yes | Array of relation specs (max 50). Each row uses the same shape as `add_relation` input. |
Output Schema
| Name | Required | Description |
|---|---|---|
| relations | Yes | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses non-atomicity, per-row independent/idempotent processing, exact error shapes, the 50-row cap, and the absence/presence of `postWriteMaintenance`. This complements the idempotentHint=true annotation without contradicting any annotation field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is front-loaded with the core capability and use case, and each subsequent clause adds actionable behavioral or error-handling detail rather than filler. It could be trimmed slightly if the output schema already documents the response fields, but the density is justified by the batch operation's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch mutation tool with one parameter, the description covers input constraints, row-level error semantics, ordering, capacity, rollback behavior, a concurrency trap, and post-write maintenance response structure. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already describes `relations` and its fields, the description adds meaningful runtime semantics: the `why` field is required nonblank for new `depends_on` rows, `expected_mtime` can become stale when multiple rows share a `from` slug, and rows are processed independently. This materially improves an agent's ability to construct valid batch payloads.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Batch-add multiple relations in one call.' It explicitly contrasts with the sibling `add_relation` by noting this replaces K×`add_relation` round-trips, so an agent can clearly distinguish the tool's purpose from the singular variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use-after condition ('Use after `analyze_repo_structure` or another review flow when the agent has K semantic edges accepted by the user') and an explicit alternative ('for all-or-nothing semantics use single `add_relation` calls'). It also warns about `expected_mtime` in specific batch scenarios, which is practical usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_repo_structureARead-only
R16 (autonomous ingest base) — analyze a code repository and propose ontology node candidates. side effect 0 (vault frontmatter NOT modified). Returns deterministic candidates the agent must turn into an evidence-backed proposal and move through the construction lifecycle before any exact batch-writer rows are released. Repository structure is implementation evidence, not automatic business meaning: extractionContract and proposedBusinessOntology make that uncertainty explicit. Detects:
package.json
name→ project candidateREADME.md first H1 → project title fallback
README.md H2 sections (skipping generic "Usage"/"Installation"/etc) → domain candidates
src/features|entities|widgets|views/* (FSD) → capability/element candidates
src/* depth-1 folders (generic) → capability candidates + index entry → element
apps/* and packages/* members with package.json → implementation element candidates
README.rst + bounded static setup.py → Python project/package evidence without execution
mixed current and future/negated/deprecated README prose → exact current candidate excerpt plus bounded line-scoped
reviewRequiredEvidence; review units stay visible but cannot support a proposal claimselected safe README sections share the existing 1,200-character budget deterministically; no document, heading, or excerpt cap grows
root Python packages plus at most 12 import-connected implementation boundaries → direct modules plus up to 2 exact security/policy/risk file anchors; unused files are not mirrored and no capability is inferred from imports
bounded root Cargo package or repo-contained literal direct workspace members → typed feature declaration + literal cfg/cfg_attr source provenance; predicates are not evaluated and no runtime/import/semantic dependency is inferred
a complete proposal may select at most 4 additional exact TypeScript, JavaScript, Python, or Rust file endpoints already observed by infer_imports for distinct navigation roles; exact dependency direction is validated and these files never become automatic candidates
when the packet identifies an implementation path but omits the rule or effect needed for review, optional
sourceReadsreturns bounded exact source lines with a full-file hash and continuation coordinates. Follow-up reads carry the returnedexpectedSha256; every proposal or qualification call replays all selected ranges with that hash. Raw source remains untrusted observed evidence and never establishes semantic meaning, approval, or write authoritya selector with
mode: 'outline'lists a file's declarations with line numbers so the next lines read is exact. For a file longer than about 200 lines, outline it first and then read the exact lines, rather than reading the head of the file and recording the rest as unread. An outline returns no source text and no citation, so it supports no claim; replay line ranges, not outlines, with a proposal or qualificationan element proposal may keep an ordinary citation and append reviewed
navigation:primary|supporting|test:<path>#<symbol>evidence strings (limits 1/1/3); the server verifies only those named current files, renders human-readable Evidence bullets, and rejects missing, ambiguous, unsafe, or task-inferred coordinates without treating them as behavior proof
Optionally pass a complete proposal to validate project/domain/capability/element definitions, typed relations, citations, risk controls, domain placement, implementation paths, confidence, and typed competency answers with resolvable concept/relation/evidence/path witnesses. Partial or visible-gap answers remain warnings instead of disappearing behind findings 0. A unqualified-project-exclusion warning is an exact human-acceptance gap, while an evidence-limit exclusion remains an error. Source-hidden review may leave exact source-body detail partial; source-aware citation verification decides support before evidence provenance can pass. A mandatory non-gap warning blocks the first review before qualification begins. For a bounded first pass, freeze claim id, statement, and proposalRefs before isolated source-hidden and source-aware lanes run in parallel; separately audit material Definition, Includes, Excludes, and Uncertainty assertions even when several claims share one proposal ref. Join sealed receipts without mutation before human acceptance. A passing validation first returns a deterministic non-writing reviewPlan, planDigest, sourceDigest, and eight-phase construction lifecycle. An independent evaluator must measure the approved competency questions and source-hidden task, then a human may declare acceptance bound to that exact plan digest/revision and every visible gap. Pass the resulting constructionQualification:v1 packet as qualification; only a current, admissible packet releases the exact reviewed rows as writePlan. The lifecycle also reports a shadow-only admission tier; self_qualified is an observation, not a write permission. Declared approval provenance is not identity authentication. Do not call write tools unless proposalValidation.canWrite is true and a writePlan is present; write every concept row successfully before writing relations.
Use the initial discovery call when a user asks "이 codebase 분석해줘" / "bootstrap the ontology"; repeat the same analysis call only for explicit source continuations and digest-bound proposal or qualification replay. Single source of truth preserved — only the user (via your subsequent add_concept calls) writes to the vault.
| Name | Required | Description | Default |
|---|---|---|---|
| ignore | No | Extra folder names to skip (added to defaults: node_modules, .git, dist, build, …). | |
| maxDepth | No | Accepted but ignored: no value changes the analysis. When given, it must be an integer from 0 to 10. | |
| proposal | No | Optional business ontology proposal to validate against repository evidence before any write call. Python proposals may select at most 4 exact observed import endpoints beyond the analyzer candidates. | |
| rootPath | No | Repository root to analyze. Defaults to the MCP server cwd. | |
| sourceReads | No | Optional 1–8 exact repository source ranges, or whole-file outlines. mode: 'outline' lists a file's declarations with line numbers so the next lines read is exact; for a file longer than about 200 lines, outline it first instead of reading its head. The 8 KiB range, 16 KiB outline, 32 KiB aggregate, and 64 KiB serialized limits apply only to the returned sourceEvidence subpacket, not to the rest of this analysis result. Returned text is bounded untrusted data, not accepted meaning; an outline is a map to the next read and carries no citation. Repeat every selector with expectedSha256 when proposal or qualification is present, and replay line ranges rather than outlines there. | |
| qualification | No | Optional independent evaluation and declared human acceptance bound to the exact planDigest, planRevision, and sourceDigest returned for this proposal. Omit it on the first review call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| domains | Yes | |
| project | No | |
| skipped | Yes | |
| elements | Yes | |
| rootPath | Yes | |
| framework | Yes | |
| meaningGate | Yes | |
| capabilities | Yes | |
| sourceEvidence | No | Bounded sourceEvidence:v1 subpacket. Its byte and row ceilings cover this subpacket only; they do not describe or truncate the complete analyze_repo_structure response. |
| semanticEvidence | Yes | |
| extractionContract | Yes | |
| proposalValidation | Yes | |
| suggestedRelations | Yes | |
| configurationEvidence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial context beyond them: side effect 0, deterministic candidates, bounded read/edit budgets (1,200-char README budget, 8/16/32/64 KiB limits, ~200-line outline threshold), the full review/qualification lifecycle, and the rule that returned source is untrusted evidence that never grants write authority. None of this is recoverable from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a ~1,500-word wall mixing bullet lists with dense jargon (reviewRequiredEvidence, sourceHiddenTask, constructionQualification:v1, axisResults). Several constraints are repeated verbatim (the expectedSha256 replay rule and the 'outline first for >200-line files' advice each appear twice), so not every sentence earns its place. Much of the lifecycle policy reads like documentation rather than selection guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still covers the critical output-side contract (reviewPlan, planDigest, sourceDigest, writePlan gating, eight-phase lifecycle, shadow-only admission tier). For a tool of this complexity with 6 params and nested proposal/qualification objects, the agent has enough to call it correctly and know what gates follow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the schema carries baseline semantics for ignore, maxDepth, proposal, sourceReads, qualificitation. The description nonetheless adds real meaning: maxDepth is accepted but ignored, sourceReads mode 'outline' returns no source text or citation and must be replayed as line ranges, and expectedSha256 becomes mandatory whenever proposal or qualification is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource (analyze a code repository and propose ontology node candidates) and immediately scopes the side effect (vault frontmatter NOT modified). The enumerated detection rules (package.json, README H1/H2, FSD folders, Cargo/Python packages) make it unmistakable versus siblings like infer_imports or read_source, which it explicitly references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger guidance ('Use the initial discovery call when a user asks ... / bootstrap the ontology') and constrains recurrence ('repeat the same analysis call only for explicit source continuations and digest-bound proposal or qualification replay'). It also states prerequisites for downstream writes (do not call write tools unless proposalValidation.canWrite and a writePlan exist). It stops short of naming alternative sibling tools to prefer for narrower cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compile_ontologyARead-only
Compile the whole markdown vault into a deterministic graph artifact: canonical nodes, edges, aliases, graph issues, graph-array canonicalization actions, and optional adjacency indexes. This is the compiler-style read path for graph-database-like use: call it before advanced reasoning, indexing, export, or non-developer-friendly graph views. Includes a stable semantic graphHash and maxMtime for cache invalidation. side effect 0. Large vaults (100+ nodes) can exceed the MCP token cap with the full payload. summary: true returns counts + graphHash + byKind/byDomain aggregates with no arrays, for cheap polling, and a call with no argument that asks for arrays returns the same bounded summary plus delivery, which names the two ways to the rest: full: true for every array, or nodesLimit/nodesOffset / edgesLimit/edgesOffset to slice them. The response includes nodesPagination / edgesPagination meta with {offset, limit, total, returned, hasMore, nextOffset} when sliced.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | When true, return every array however large the vault is (the answer without arguments is the bounded summary). Page arguments still slice nodes and edges. | |
| summary | No | When true, omit `nodes` / `edges` / `aliases` / `ambiguousAliases` / `canonicalizationActions` / `indexes` arrays — return only `graphHash`, `maxMtime`, counts (`nodeCount`/`edgeCount`/`aliasCount`/...), and aggregate `byKind`/`byDomain` as counts. Cheap polling for cache invalidation and graph-size assessment. Wins over every other argument. | |
| edgesLimit | No | Positive integer max edges to return. Pair with `edgesOffset` to paginate. Max 500. | |
| nodesLimit | No | Positive integer max nodes to return. Pair with `nodesOffset` to paginate. Max 500; `full: true` without it returns every node. | |
| edgesOffset | No | Non-negative integer starting index in the sorted edges array. Defaults 0. | |
| nodesOffset | No | Non-negative integer starting index in the sorted nodes array. Defaults 0. | |
| includeIndexes | No | When true, include indexes `{out, in, byKind, byDomain, edgeById, aliasToSlug, uidToSlug, slugToUid, mergedUidToSlug}`. Graph traversal remains slug-based; UID indexes provide exact identity resolution. Defaults false to keep payload smaller. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | No | |
| nodes | No | |
| byKind | Yes | |
| issues | No | |
| aliases | No | |
| indexes | No | |
| summary | No | |
| version | Yes | |
| byDomain | Yes | |
| delivery | No | Present when no argument asked for arrays: this is the bounded summary, and these arguments return the rest. |
| maxMtime | Yes | |
| edgeCount | Yes | |
| graphHash | Yes | |
| nodeCount | Yes | |
| aliasCount | Yes | |
| issueCount | Yes | |
| edgesPagination | No | |
| nodesPagination | No | |
| ambiguousAliases | No | |
| externalEdgeCount | Yes | |
| resolvedEdgeCount | Yes | |
| ambiguousAliasCount | Yes | |
| referencedOnlyCount | Yes | |
| skippedNonNodeCount | No | Summary answers only: `.md` files passed over for having no `kind:`. |
| unresolvedEdgeCount | Yes | |
| canonicalizationActions | No | |
| canonicalizationActionCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/destructive/openWorld, and the description adds substantial extra context: 'side effect 0,' the MCP token cap risk on large vaults, the precedence of `summary` over other args, the fallback bounded summary with a `delivery` field, and the pagination meta shape. This is well beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and usage trigger before diving into payload/pagination mechanics. It is dense and mostly earns its sentences, though the closing pagination-meta sentence overlaps with what the schema and output schema already convey.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param, read-only compile tool with an output schema, the description covers everything an agent needs: token-cap behavior, caching via graphHash/maxMtime, summary vs full vs paged modes, and precedence rules. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interaction semantics the schema cannot express: that `summary` 'wins over every other argument,' that `full: true` returns every array while page args still slice, and how offsets/limits pair together. This is genuine added meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Compile') and resource ('the whole markdown vault') and enumerates the artifact contents (nodes, edges, aliases, issues, canonicalization actions, optional indexes). It also positions itself as 'the compiler-style read path,' which distinguishes it from siblings like query_ontology and validate_vault.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'call it before advanced reasoning, indexing, export, or non-developer-friendly graph views.' It also explains when to use the cheap summary mode ('cheap polling'). It does not name specific alternative sibling tools for overlapping needs, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_infoARead-only
Return the exact active vault root and code-repository root used by this MCP process, including how each root was resolved. Call first when a client may have stale configuration or multiple workspaces. Root changes require restarting the MCP process. Always returns guide.card, the construction card, plus guide.topics. Pass guide to also receive guideText, the full text of that topic, because a host may truncate the server instructions while tool results arrive whole.
| Name | Required | Description | Default |
|---|---|---|---|
| guide | No | Return the long-form rules for one topic in `guideText`: `meta_model` (the five authorable kinds and the is_a boundary), `construction` (the rules to read before add_concept), `lifecycle` (review before write), `write_safety` (the dry-run/confirm and expected_mtime patterns), `workflows` (the three starting workflows), or `competency` (the exact `## Competency answers` section `finalize_project_meaning` parses). |
Output Schema
| Name | Required | Description |
|---|---|---|
| guide | Yes | |
| server | Yes | |
| repoRoot | Yes | |
| sameRoot | Yes | |
| guideText | No | |
| vaultRoot | Yes | |
| repoResolution | Yes | |
| vaultResolution | Yes | |
| restartRequiredForRootChange | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, not destructive), and the description adds real behavioral context beyond them: root changes require restarting the MCP process, the return shape is always guide.card plus guide.topics, and it explains the host-truncation rationale for the guideText path. This is information an agent could not get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core return values, then usage, then the optional parameter. Every sentence carries information, though it is dense and could be split slightly more cleanly. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't enumerate return values, yet it still summarizes the guaranteed fields (guide.card, guide.topics) and the optional guideText. Combined with the restart constraint and the stale-config call trigger, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a rich enum description, so the schema carries most of the load (baseline 3). The description adds genuine value by explaining why to pass `guide` – it returns guideText, the full topic text, because hosts may truncate the server instructions while tool results arrive whole. That is semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and resource ('the exact active vault root and code-repository root used by this MCP process'), with the added scope of 'how each root was resolved'. No sibling tool deals with connection roots, so it is clearly distinguishable from the 30+ other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-call guidance: 'Call first when a client may have stale configuration or multiple workspaces.' It also notes the restart prerequisite for root changes, which is a usage constraint. It does not name a direct alternative, but none is needed for a diagnostic tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_project_sourceA
Bind a project node to the local code folder it describes, measure it, and write the source receipt. This is what nextAction: connect_source (and repair_source_binding / measure_source / remeasure_source) asks for. Omit rootPath and the server infers it: the git repository enclosing the vault wins, otherwise the nearest ancestor folder carrying a project manifest. Without confirm: true nothing is written — you get the proposed folder, how many declared path: claims actually land in it, and the exact confirming call. Re-running with a different rootPath replaces the binding; disconnect_project_source removes it. The absolute root stays in the local gitignored sidecar .ontology-atlas/project-sources.json and never enters the receipt, the graph markdown, or any handoff.
| Name | Required | Description | Default |
|---|---|---|---|
| repair | No | Discard a malformed .ontology-atlas/project-sources.json instead of refusing to write over it. | |
| confirm | No | Required to write. Default false returns the proposal and changes nothing. | |
| rootPath | No | Absolute local folder holding the code. Omit to auto-infer, or to re-measure an existing binding. | |
| projectSlug | Yes | Exact project node slug (or an unambiguous vault alias) to bind. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| mode | Yes | |
| undo | No | |
| remedy | No | |
| binding | Yes | |
| changed | Yes | |
| contract | Yes | |
| nextCall | No | |
| confirmed | Yes | |
| inference | No | |
| projectSlug | Yes | |
| projectSource | No | |
| previewReceipt | No | |
| previousBindingCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false, so the description's job is to add context beyond those flags. It does so richly: nothing is written without confirm:true, re-running replaces the binding, the absolute root is stored in a gitignored sidecar and never enters the receipt or graph markdown, and repair discards a malformed sidecar. This is exactly the kind of behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, trigger context, inference rule, dry-run behavior, replacement semantics, and sidecar storage are each covered in one or two clauses. It is front-loaded with the core action and routes to alternatives early. No filler or repetition of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, an output schema, and annotations, the description covers all the non-obvious context: the dry-run default, the inference fallback, the replacement behavior, the sidecar location, and the privacy boundary (absolute root never enters receipt/graph/handoff). An agent has everything needed to call it correctly and to interpret the proposal response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it explains that omitting rootPath triggers auto-inference (git repo enclosing the vault, else nearest ancestor with a project manifest), that confirm:true is required to write, and that repair handles a malformed sidecar. It doesn't add detail on projectSlug beyond the schema, but the added rootPath and confirm semantics justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb phrase — 'Bind a project node to the local code folder it describes, measure it, and write the source receipt' — and immediately distinguishes the tool from siblings by naming the exact nextAction values and related tools it fulfills. It also contrasts with disconnect_project_source, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('This is what nextAction: connect_source ... asks for'), what happens when confirm is omitted, how rootPath inference works, and how re-running with a different rootPath behaves. It also names the sibling that removes the binding, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_conceptADestructive
⚠ DESTRUCTIVE — permanently deletes the vault .md file. Two-stage safety:
Both preview and confirmed responses identify the node by permanent uid plus current slug. 1. Without confirm: true the call is a dry-run — returns a backlinks preview without deleting.
2. If any backlinks exist the call throws — refuses while other nodes still reference this slug. Pass force: true to delete anyway (the referrers become dangling).
Successful deletion returns the frontmatter + body so a user who deleted by mistake can recreate the node via add_concept. Directories are left untouched. Pass expected_mtime to guard against concurrent external edits — throws if the file changed on disk since you read it. Confirmed deletes return compact postWriteMaintenance (maintenance_plan) with count-safe byPhase / bySeverity / byKind queue buckets, action score, executable proposedAction, and current-page nextExecutableAction / nextReviewAction pointers for the final graph.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Vault-relative slug (omit the .md extension). | |
| force | No | Delete even when backlinks exist (referrers become dangling). Defaults to false. | |
| confirm | No | Actually delete when true. Omit or false for a dry-run (backlinks preview, no delete). | |
| expected_mtime | No | Optional conflict guard — file mtimeMs at read time. If it differs at delete time, the call throws. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| uid | Yes | |
| slug | Yes | |
| dryRun | Yes | |
| forced | No | |
| changed | No | |
| message | No | |
| captured | No | |
| filePath | Yes | |
| backlinks | No | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| backlinksAtDelete | No | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, but the description adds substantial behavior: two-stage safety, backlink throw, dangling referrers after force, returned frontmatter/body for recovery, directory preservation, mtime conflict, and maintenance output. This goes well beyond what the annotations disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive warning and numbered safety flow, so critical information appears early. The final sentence detailing postWriteMaintenance fields is long and partly redundant with the output schema, but the overall structure is efficient for a complex destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with rich annotations and an output schema, the description closes the remaining gaps: safety staging, refusal/override conditions, recovery output, and concurrency guard. An agent has enough context to invoke it without surprise.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 nevertheless adds semantic consequences for confirm, force, and expected_mtime (dry-run behavior, dangling referrers, conflict throw). It does not add new syntax for slug, but it deepens the operational meaning of the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific destructive verb and resource ('permanently deletes the vault .md file') and scopes it to concept deletion. An agent can distinguish this from sibling read/list/relation tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit operational guidance: dry-run without confirm, refusal when backlinks exist, force override with the dangling-referrer consequence, and expected_mtime as a concurrency guard. It lacks a direct comparison to sibling alternatives, but no other concept-deletion sibling exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnect_project_sourceADestructive
Remove a project node's local source binding and its receipt. The reversal of connect_project_source — use it when the wrong folder was bound, or to stop measuring. Without confirm: true it only reports what would be removed. Other projects' bindings are never touched, and no ontology markdown changes.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Required to write. Default false lists the binding that would be removed. | |
| projectSlug | Yes | Project node slug whose source binding should be removed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| remedy | No | |
| changed | Yes | |
| removed | Yes | |
| bindings | Yes | |
| contract | Yes | |
| nextCall | No | |
| confirmed | Yes | |
| projectSlug | Yes | |
| projectSource | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds meaningful behavioral context: it removes both the binding and its receipt, requires confirm:true to write, defaults to a dry-run report, and explicitly scopes the blast radius to the single project. The only minor gap is that it doesn't describe the output schema's contents, but the output schema exists and the description covers the key behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The core action is front-loaded, the inverse relationship is stated, usage conditions are given, and safety scope is clarified. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool, the description covers the action, the prerequisite (confirm:true), the dry-run behavior, the scope limitation, and the non-effect on ontology markdown. The output schema exists, so return values don't need to be described. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds the crucial semantic that confirm:true is required to write and defaults to listing what would be removed, which enriches the confirm parameter's meaning. However, it doesn't add much beyond that, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Remove'), a specific resource ('a project node's local source binding and its receipt'), and explicitly names its inverse sibling (connect_project_source). This clearly distinguishes it from siblings like delete_concept or remove_relation, and the 'reversal of connect_project_source' framing makes the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'use it when the wrong folder was bound, or to stop measuring.' It also explains the safety behavior without confirm:true, and states what is never touched ('Other projects' bindings are never touched, and no ontology markdown changes'). This is strong usage guidance that an agent can act on directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_project_meaningA
Finalize the current project competency Markdown after concept/relation writes, vault validation, and a complete project compile. The server derives the current body digest, project graph hash, source fingerprint, and witness inventory itself; callers cannot submit or restamp those values. This writes only a small provenance receipt to .ontology-atlas/project-meaning.json. It never stores raw answers, witness text, absolute source roots, or remote coordinates. ok: true means the receipt was written, not that source currentness is verified; read meaningAssessment or a fresh agent_brief for the fail-closed categorical result.
| Name | Required | Description | Default |
|---|---|---|---|
| projectSlug | Yes | Exact project node slug (or an unambiguous vault alias) whose current Competency answers section should be finalized. | |
| expected_mtime | Yes | Required conflict guard. Pass the project node mtime from get_concept; any intervening human or agent edit blocks finalization. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| changed | Yes | |
| contract | Yes | |
| graphHash | Yes | |
| bodyDigest | Yes | |
| measuredAt | Yes | |
| projectSlug | Yes | |
| meaningAssessment | Yes | |
| sourceFingerprint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses precise write behavior: it writes only a small provenance receipt to `.ontology-atlas/project-meaning.json` and explicitly lists what it never stores. It also explains the semantic meaning of `ok: true`, which prevents a common misinterpretation. These details complement the sparse annotations significantly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: sequencing, caller constraints, write scope, exclusions, and result interpretation are all covered without repetition. It is appropriately sized for a tool with subtle semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two parameters and non-trivial side effects, the description fully covers when to call it, what it writes, what it refuses to write, what the result flag means, and where to get the actual assessment. Nothing essential is left to inference, and the output schema is referenced through `meaningAssessment`/`agent_brief`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters well. The description adds important semantic value by explaining that `expected_mtime` is a conflict guard and that callers cannot submit or restamp server-derived values, reinforcing the role of `projectSlug` and `expected_mtime`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Finalize') and a specific resource ('current project competency Markdown'), and it distinguishes the action from related operations by specifying the exact sequence it must follow. It also clarifies the tool's narrow scope: writing a provenance receipt, not compiling or validating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool after concept/relation writes, vault validation, and a complete project compile, which gives clear contextual conditions. It also warns that `ok: true` does not verify source currentness and directs callers to `meaningAssessment` or `agent_brief` for the fail-closed result. It does not name alternative sibling tools, but the sequencing is specific enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_backlinksARead-only
Return every node that points to the target slug. Scans both frontmatter array keys (capabilities / elements / dependencies / relates / contains / describes etc.) and the wikilinks / markdown links in the body. Used by AI agents to walk the graph from a node to its dependents.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Target vault-relative slug (omit the .md extension). |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| target | Yes | |
| matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavioral scope beyond them: it enumerates that frontmatter array keys (capabilities/elements/dependencies/etc.) AND body wikilinks/markdown links are scanned, which tells the agent exactly what counts as a backlink.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core behavior and followed by the scanning scope and use case. No filler, though the third sentence is closer to rationale than operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary. The description covers the scan sources and directionality, leaving only explicit sibling routing unaddressed, which is a minor gap for a single-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'slug' param is already documented in the schema (vault-relative, omit .md). The description adds no extra syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+direction: 'Return every node that points to the target slug.' The inbound-edge semantics clearly distinguish it from siblings like find_neighbors (neighbors) and find_path (paths) without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Used by AI agents to walk the graph from a node to its dependents' implies an intended use context, but it never states when to pick this over find_neighbors or find_path, nor any exclusion conditions. Usage is only inferred, not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_evidenceARead-only
Find vault docs that mention a given concept by title. Useful when an AI agent asks where a capability is realized in code or docs. Each match includes a prose excerpt (max 200 chars, headings/tables/code skipped) so agents see what the matching doc says without an extra get_concept call. Matches are RANKED by a deterministic relevance score (title match > frontmatter ref > body, plus a title token-overlap tiebreaker), then by whether the doc is a graph node, then slug — best-first. A vault holds ordinary markdown too (meeting notes, memos, drafts have no kind: and are not graph nodes); every row says which it is via isNode, non-nodes rank below nodes of equal relevance, and nodesOnly: true filters them out. Do not cite a non-node as graph evidence without saying so. Returns the best 50 by default (limit up to 500), with total matches and limited when more matched. When zero docs mention the title, the response includes a growthHint — near-titled vault nodes to check first, or an add_concept scaffold if the concept looks genuinely new.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return only the top-N highest-scoring matches. Defaults 50; `total` and `limited` say whether more matched. | |
| title | Yes | Concept title to search for (case-insensitive substring match). | |
| nodesOnly | No | Return only graph nodes (docs with a `kind:`). Default false — ordinary markdown in the same folder is included and marked `isNode: false`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| total | No | Every document that matched, before `limit`. |
| limited | No | True when `matches` holds fewer rows than `total`. |
| matches | Yes | |
| bodyHint | No | Only present when at least one match returned a partial excerpt — names the get_concepts({ body: "full" }) call that returns the rest. |
| limitHint | No | Only present when `limited`: how to narrow the search or raise `limit`. |
| growthHint | No | Only present when matches is empty — near-titled vault node(s) to check, or an add_concept scaffold, derived from the real vault title set. |
| nonNodeHint | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive), so the bar is lower, yet the description still discloses substantial behavior: excerpt truncation at 200 chars with heading/table/code skipping, the deterministic ranking order (title > frontmatter > body, node-ness, slug), default 50 / max 500 with total and limited flags, and the growthHint on zero matches. This is far more than the annotations carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and is generally efficient, with the most actionable routing and ranking facts early. It is dense and long with heavy bold/caps formatting, and a few clauses (e.g. the full ranking tiebreaker chain) could be tightened, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param search tool with an output schema, the description supplies everything needed to call it correctly and interpret results: node vs non-node semantics, ranking, limit/truncation signals, and the empty-result growthHint path. No behavioral or usage gap an agent would need remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains that limit defaults to 50 and that total/limited signal truncation, and that nodesOnly filters ordinary markdown that would otherwise rank below nodes. It clarifies the intent of each parameter rather than restating types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find vault docs that mention a given concept by title') and distinguishes itself from siblings like get_concept by providing the excerpt inline. An agent can tell instantly that this is a ranked text search over vault docs rather than a concept fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('when an AI agent asks where a capability is realized in code or docs') and a caution ('Do not cite a non-node as graph evidence without saying so'), which is a real usage constraint. It does not explicitly route against alternatives like get_concept or query_concepts beyond the passing mention, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_neighborsARead-only
Return the one-hop graph neighborhood around a node. Unlike find_backlinks, this is graph-frontmatter only and can include outgoing, incoming, or both directions. Returns canonical edges plus neighbor node summaries so agents can inspect a local subgraph in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Center node slug, unique tail slug, or frontmatter `slug` alias. | |
| limit | No | Positive integer max edges to return. Defaults to 100, max 500. | |
| types | No | Optional relation types/frontmatter keys to include, e.g. ["domain", "depends_on", "contains"]. Public add_relation types are normalized to stored graph keys. | |
| direction | No | Edge direction to include. Defaults to both. | |
| includeNodes | No | When true (default), include neighbor node summaries for resolved edges. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | |
| nodes | No | |
| types | No | |
| center | Yes | |
| limited | Yes | |
| direction | Yes | |
| requested | Yes | |
| totalEdges | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false, the safety profile is already covered. The description adds meaningful behavioral context beyond annotations: it specifies the graph-frontmatter-only scope, supports outgoing/incoming/both directions, and describes the return composition (canonical edges plus neighbor node summaries). This is useful and consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core purpose, distinguishes the tool from a sibling, and then describes the return value compactly. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the five-parameter schema and output schema, the description covers the important contextual pieces: graph scope, direction flexibility, and output composition. It could have added a bit more explicit guidance on when to choose this over find_backlinks, but the overall definition is sufficiently complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already documented in the schema. The narrative description adds a bit of related context around direction options and output shape, but it does not materially explain individual parameters beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a precise verb ('Return') and identifies a specific resource ('the one-hop graph neighborhood around a node'). It also explicitly contrasts itself with find_backlinks, making the tool's role clear relative to a likely sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names find_backlinks as an alternative and states the key distinguishing factor: this tool is graph-frontmatter only. This effectively tells an agent when this tool applies, but it stops short of giving an explicit 'when not to use' condition or direct guidance for other sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_orphansARead-only
List orphan nodes — docs that no other node references via any frontmatter array key. Useful as a cleanup starting point or to answer "which nodes are unused?". Same matching policy as find_backlinks (full slug or final segment). Root/sentinel kinds like project and vault-readme are excluded by default.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Restrict to one kind (e.g. capability). Omit for all kinds. | |
| excludeKinds | No | Kinds to exclude from results. Defaults to ['project', 'vault-readme']. Pass [] to include every kind. Typos fail with nearest-value hints. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| orphans | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral details beyond that: the default exclusion of root/sentinel kinds and the specific matching policy (full slug or final segment). This enriches the agent's understanding without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, and every sentence adds value: the definition, the use cases, and the matching policy plus default exclusions. There is zero waste or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a full output schema, the description covers the essential purpose, use cases, matching policy, and default exclusions. It doesn't describe the output format, but that is handled by the output schema. The only minor gap is that it doesn't explicitly mention pagination or performance, but these are not critical for a tool like this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – both 'kind' and 'excludeKinds' have descriptive text in the schema, including the default value for excludeKinds. The tool description reinforces the default exclusion but does not add new parameter-specific meaning beyond what the schema already provides. Given the high schema coverage, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List orphan nodes' and defines exactly what an orphan node is ('docs that no other node references via any frontmatter array key'). It also distinguishes itself from the sibling find_backlinks by referencing the same matching policy, so an agent can differentiate them without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use case ('cleanup starting point' and 'which nodes are unused?') and explicitly notes that the matching policy is shared with find_backlinks, which implicitly tells an agent that find_backlinks is the counterpart for finding referenced nodes. However, it doesn't explicitly state when not to use this tool or name alternative tools for different scenarios, so it's slightly short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_pathARead-only
Shortest path between two nodes (undirected BFS). Returns { from, to, hops: [slug...], nodes: [{uid, slug, kind, title, domain?}], edges: [{from, to, via, rationale?}] } where each via is the frontmatter key (domains / domain / capabilities / elements / dependencies / relates / contains / describes) that linked the two slugs and rationale is the one-line relation_notes sentence the declaring document stores for that pair (present only when one is stored) — so the agent sees not just that A and B are connected but by which key and, when someone wrote it down, why. Returns { found: false } when no path is found within maxHops, plus a growthHint — a concrete add_relation (both endpoints exist) or add_concept (an endpoint is missing) example so the unanswered question becomes a vault-growth signal instead of a dead end. maxHops defaults to 5 and is capped at 20.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target slug. | |
| from | Yes | Source slug. | |
| maxHops | No | Non-negative integer maximum hop count (default 5, max 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| from | Yes | |
| hops | No | |
| edges | No | |
| found | Yes | |
| nodes | No | |
| reason | No | |
| hopCount | No | |
| growthHint | No | Only present when found=false — a candidate add_relation (both endpoints exist) or add_concept (an endpoint is missing) suggestion, derived from the real vault, not invented. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations (readOnlyHint=true, destructiveHint=false) by detailing the exact output structure: nodes with uid/slug/kind/title/domain, edges with from/to/via/rationale, the meaning of via as a frontmatter key, and the fallback { found: false } with a growthHint. It also discloses the undirected BFS algorithm, maxHops default (5) and cap (20). This is rich behavioral disclosure that fully informs the agent without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it leads with the core purpose, then details the output shape, then explains the fallback and maxHops. Every sentence carries useful information; there is no filler. It is slightly long, but the complexity of the output justifies the length. It is front-loaded with the essential action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and the annotations already cover read-only safety, the description is complete. It explains the return structure in detail, the failure mode with growthHint, and the algorithm constraints. There is nothing an agent needs to know about invoking this tool that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for all three parameters (from, to, maxHops) with 100% coverage. The description adds the default (5) and cap (20) for maxHops, which is also stated in the schema, and clarifies that from/to are slugs (already in schema). It does not introduce new meaning beyond what the schema provides, so it sits at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific statement of what the tool does: 'Shortest path between two nodes (undirected BFS).' This unambiguously names the verb (find path) and resource (nodes in a graph). However, it does not explicitly differentiate from sibling tools like find_neighbors or find_backlinks, though the purpose itself is distinct enough that an agent could infer when to use it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. It describes behavior and output in detail but never states conditions like 'Use this when you need the shortest path' or 'For direct neighbors, use find_neighbors instead.' The mention of growthHint implies a use case for exploring gaps, but that is implicit and not framed as selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conceptARead-only
Fetch one node by exactly one selector: slug (canonical slug or unique alias) or immutable uid. Successful responses always carry both the permanent uid and current canonical slug; graph relations and graph-operation inputs remain slug-based. Returns frontmatter, body, direct graph neighbors, outgoingEdges (each {to, via, rationale?}, the rationale being the stored relation_notes sentence when one exists), and mtime. By default you get excerpt — the first prose paragraph only. The node body is where the construction rules put definition, evidence, confidence, and in-scope/out-of-scope, so pass body: "full" whenever you are reading a node to answer a question rather than just to identify it. bodyInfo always reports totalChars / returnedChars / truncated, so a partial read is never silent. For K specific selectors in one call use get_concepts({slugs: [...]}) or get_concepts({uids: [...]}). When a slug does not resolve, structured growth guidance remains available.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | Exact permanent node UID. Use instead of `slug`, never together with it. | |
| body | No | `excerpt` (default) returns the first prose paragraph as `excerpt`. `full` returns the entire markdown body as `body` and omits `excerpt`. Use `full` when the answer depends on what the node actually says — evidence paths, confidence, scope boundaries. | |
| slug | No | Vault-relative slug (e.g. projects/auth-platform), unique tail slug, or frontmatter `slug` alias. Omit the .md extension. |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | Yes | Permanent immutable node identity. |
| body | No | Entire markdown body. Present only when the caller passed `body: "full"`. |
| slug | Yes | |
| mtime | Yes | |
| isNode | Yes | |
| review | Yes | |
| excerpt | No | First prose paragraph. Present only when `body` is `excerpt` (the default). |
| bodyInfo | Yes | How much of the body this response carries — always present, so truncation is never silent. |
| warnings | No | |
| neighbors | Yes | Direct graph neighbor buckets. |
| frontmatter | Yes | Resolved markdown frontmatter. |
| outgoingEdges | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial context beyond them: default returns only the first prose paragraph, bodyInfo always reports totalChars/returnedChars/truncated so partial reads are never silent, and it explains that uid/slug are always both returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation and selector rule, and every sentence carries distinct information. It is dense and heavily bolded, which costs a little readability, but little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description still communicates the shape of the response (frontmatter, body, neighbors, outgoingEdges with rationale, mtime) and the truncation contract, so an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value: the excerpt-vs-full tradeoff and that 'full' omits 'excerpt', plus the mutual exclusivity of slug and uid beyond what the schema's own text states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Fetch one node') with an explicit uniqueness constraint on selectors (exactly one of slug or uid). It clearly differentiates itself from the sibling get_concepts, which it names for the multi-selector case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: default excerpt for identification, pass body:'full' when reading to answer a question, and use get_concepts for K selectors in one call. It even notes fallback behavior when a slug fails to resolve.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conceptsARead-only
Fetch multiple nodes by exactly one selector array: slugs (canonical slugs or unique aliases) or immutable uids. Same per-row shape as get_concept; successful rows always return permanent uid plus current canonical slug. Order matches the selected input array. Missing or invalid slug rows return partial {slug, ok:false, error, ...repairFields} rows, so later valid slugs still resolve; UID misses likewise return {uid, ok:false, error, ...repairFields} without aborting the batch. Graph relations and graph-operation inputs remain slug-based.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Applies to every row. `excerpt` (default) returns the first prose paragraph per row; `full` returns the entire markdown body per row and caps the batch at 20 slugs. | |
| uids | No | Exact permanent node UIDs. Use instead of `slugs`, never together with it. Max 50 (max 20 with body `full`). | |
| slugs | No | Vault-relative slugs, unique tail slugs, or frontmatter `slug` aliases (e.g. ["capabilities/x", "elements/y"]). Omit the .md extension. Max 50 per call (max 20 when body is `full`). |
Output Schema
| Name | Required | Description |
|---|---|---|
| concepts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint, destructiveHint=false), and the description goes well beyond them: partial-failure semantics for missing/invalid slugs and UIDs, ordering guarantees, permanent uid + canonical slug on success, and the batch cap implications. This is exactly the extra behavioral context that annotations cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and selector rule, then failure semantics. Dense but every sentence carries information; the run-on clauses about partial rows are slightly heavy but justified by the batch failure model.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param batch read tool with a full output schema, the description covers selection rules, ordering, per-row success/failure shape, and batching limits. An agent needs nothing more to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the cross-parameter constraint ('exactly one selector array') and links body=full to a reduced batch cap. That said, it does not fully document the repairFields shape beyond naming it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch multiple nodes') and names the exact selector mechanism (slugs or uids). The plural form is implicitly contrasted with the sibling get_concept (singular), so an agent can distinguish batch from single fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly states the constraint that exactly one selector array must be used and that slugs and uids are mutually exclusive ('Use instead of slugs, never together'). It does not explicitly route to alternatives like query_concepts or find_neighbors, but the usage conditions are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_constellationARead-only
Read one saved constellation by immutable ID from this configured vault. Returns paged saved membership and user purpose separately from current UID-resolved node facts, review currentness, bounded evidence starting points, real declared internal relations, unresolved identities, and direct outside-scope dependencies. UID and merged-UID claims are the only identity source; display paths/titles never retarget. No writes or external sending.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Immutable UUIDv4 of the saved constellation. | |
| limit | No | Maximum saved members and their current facts to return. Defaults to 50; maximum 100. | |
| offset | No | Zero-based offset into saved members after deterministic order. | |
| relationLimit | No | Maximum real declared relations between resolved saved members. Defaults to 100; maximum 200. | |
| dependencyLimit | No | Maximum direct declared dependency edges crossing the saved scope. Defaults to 100; maximum 200. |
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| current | No | |
| contract | Yes | |
| coverage | No | |
| guidance | Yes | |
| relations | No | |
| selection | No | |
| availability | Yes | |
| outsideScopeDependencies | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'No writes or external sending.' It adds behavioral guarantees about identity source ('UID and merged-UID claims are the only identity source') and non-retargeting of display paths/titles, which go beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and keeps all content relevant. The second sentence is a dense enumeration of return categories, which packs information efficiently but relies on domain jargon such as 'review currentness' and 'bounded evidence starting points.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with an output schema and rich annotations, the description covers the essential behavioral context: what is read, what is returned at a category level, identity semantics, and absence of side effects. It is complete enough for an agent to invoke the tool correctly with id and optional limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter already has a description. The description adds semantic mapping by tying pagination to 'saved membership,' relationLimit to 'real declared internal relations,' and dependencyLimit to 'direct outside-scope dependencies,' which enriches the raw schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read one saved constellation by immutable ID from this configured vault.' This clearly differentiates it from list_constellations (listing) and get_concept (concept lookup), and highlights the immutable-ID scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when the tool applies—reading a single saved constellation by immutable ID—but it never explicitly names alternatives such as list_constellations for enumeration or states when not to use this tool. The usage is therefore implied rather than explicitly routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_historyARead-only
Read commit history scoped to the active vault path only. Returns bounded newest-first hashes, subjects, and authored timestamps plus limited/hasMore, shallow-repository state, and historyComplete so agents do not mistake a truncated or shallow view for complete evidence. Commits that touched only files outside the vault are excluded. Read-only; never initializes, fetches, pulls, commits, or pushes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum newest-first vault commits to return. Defaults to 20; maximum 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| head | No | |
| count | No | |
| limit | No | |
| branch | No | |
| reason | No | |
| commits | No | |
| hasMore | No | |
| limited | No | |
| shallow | No | |
| repoRoot | Yes | |
| operation | Yes | |
| vaultRoot | Yes | |
| vaultPathspec | No | |
| historyComplete | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description goes well beyond that by detailing behavioral nuances: it returns bounded newest-first results, includes limited/hasMore, exposes shallow-repository state, and provides historyComplete so agents don't mistake truncated or shallow views for complete evidence. It also explicitly states it never performs mutation actions. This is rich, additive behavioral disclosure that significantly aids correct agent reasoning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences that are dense with information yet free of filler. It front-loads the core purpose in the first sentence, then packs behavioral and scoping details into the second. Every clause adds value, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema (implied by context signals) and a single documented parameter, the description covers all critical aspects: the scope, the return semantics (hashes, subjects, timestamps, limited/hasMore, shallow state, historyComplete), the exclusion rule, and the read-only guarantee. An agent would have everything needed to call and interpret the tool correctly without missing crucial information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents the single optional 'limit' parameter with its default and maximum, achieving 100% schema coverage. The description does not add any additional meaning or nuance about the parameter itself; it focuses on the return format and behavior. Since the schema already does the heavy lifting, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read'), resource ('commit history'), and scope ('scoped to the active vault path only'). It also adds the exclusion of commits touching files outside the vault, which clearly delineates what the tool provides. This is a crisp purpose statement that distinguishes it from other Git-related tools like git_snapshot or git_status without naming them, but the specificity is sufficient.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is appropriate: only vault-scoped history, and explicitly states what it does NOT do ('never initializes, fetches, pulls, commits, or pushes'), which helps an agent avoid misuse. However, it does not name sibling alternatives or provide explicit 'use X instead' conditions, which would make the routing guidance even stronger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_snapshotADestructive
Create a local, vault-scoped Git checkpoint. Dry-run by default and returns exact expectedHead, files, validation, risk, and the shared previewReady/canConfirm/wouldChange/blockedReasons safety contract. confirm:true requires that expectedHead, blocks validator errors and Git operations in progress, commits only the vault pathspec, leaves outside files untouched, and never pushes.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Default false. Set true only after reviewing the dry-run preview and its risk/validation fields. | |
| message | No | Optional local commit subject, one line and at most 200 characters. A deterministic ontology snapshot subject is generated when omitted. | |
| expectedHead | No | Required with confirm:true. Copy the exact expectedHead returned by the immediately preceding dry-run; this prevents committing after a concurrent HEAD change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| head | No | |
| risk | No | |
| files | No | |
| branch | No | |
| counts | No | |
| dryRun | Yes | |
| reason | No | |
| subject | No | |
| repoRoot | Yes | |
| committed | Yes | |
| operation | Yes | |
| vaultRoot | Yes | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| commitHash | No | |
| pushReason | No | |
| validation | No | |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| detachedHead | No | |
| expectedHead | No | |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| previousHead | No | |
| commitSummary | No | |
| pushSupported | No | |
| vaultPathspec | No | |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| stagedOutsideVault | No | |
| operationInProgress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark destructiveHint:true, the description adds valuable behavioral detail: confirm commits only the vault pathspec, leaves outside files untouched, never pushes, and blocks on validation errors or Git operations in progress. It also explains the dry-run return contract and expectedHead requirement, giving the agent meaningful insight beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core purpose in the first sentence. The second sentence packs many safety clauses, but its run-on grammar and list-like structure ('requires that expectedHead, blocks validator errors...') make it slightly harder to parse. Still, no filler is present and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool complexity, an output schema exists, and annotations already flags destructive behavior, the description provides enough context for safe invocation: dry-run flow, confirm semantics, expectedHead, vault-only commits, and no push. It doesn't describe exact return structure, but that is covered by the output schema, and it omits no critical invocation step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description clarifies the interaction between confirm and expectedHead and mentions the deterministic auto-generated message, adding some cross-parameter meaning. However, it does not go deeply beyond what the schema already says; the schema itself already documents the dry-run-first confirm requirement and the expectedHead copy instruction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Create a local, vault-scoped Git checkpoint') and clearly distinguishes it from sibling tools by emphasizing local, vault-scoped, and 'never pushes.' An agent can tell git_snapshot apart from git_status or git_history because the purpose includes scope, local-only behavior, and checkpoint creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow guidance: dry-run by default, review the returned preview/risk fields, then set confirm:true. It also states behavioral preconditions such as blocking on validator errors and active Git operations. It does not explicitly name alternative tools or say 'use X instead', which keeps this from a 5, but the usage context is unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_statusARead-only
Inspect local Git state for the active vault only. Returns HEAD/branch, vault files, outside-vault change counts, staged-outside-vault warnings, and in-progress operation risk. Read-only; never initializes, stages, commits, or pushes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| head | No | |
| risk | No | |
| files | No | |
| branch | No | |
| counts | No | |
| dryRun | No | |
| reason | No | |
| subject | No | |
| repoRoot | Yes | |
| committed | No | |
| operation | Yes | |
| vaultRoot | Yes | |
| commitHash | No | |
| pushReason | No | |
| validation | No | |
| detachedHead | No | |
| expectedHead | No | |
| previousHead | No | |
| commitSummary | No | |
| pushSupported | No | |
| vaultPathspec | No | |
| stagedOutsideVault | No | |
| operationInProgress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description goes further by enumerating specific non-actions ('never initializes, stages, commits, or pushes') and flagging 'in-progress operation risk', which is valuable behavioral context not present in the structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose and return contents are front-loaded, followed by explicit non-behaviors. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema documents the return shape, so the description only needs to convey invocation-relevant details. It covers scope ('active vault only'), key return categories, and behavioral constraints. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to document; schema coverage is trivially 100%. The description correctly avoids inventing parameters, satisfying the baseline for parameterless tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Inspect') and names the exact resource ('local Git state for the active vault'). It enumerates distinct return items (HEAD/branch, change counts, staged-outside-vault warnings, risk) that clearly differentiate it from sibling tools like git_history and git_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope is clearly stated ('active vault only') and the read-only nature is explicit, giving an agent solid context for when this tool is safe to invoke. However, it does not explicitly name sibling alternatives or state when to prefer this over git_history/git_snapshot, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_projectARead-only
Project ontology indexing plan — run analyze_repo_structure + infer_imports + validate_vault in one read-only call. Use for large or already-existing projects where the agent needs a resumable ontology indexing checkpoint before writing. Its extractionContract treats source facts as observed evidence, README/folder meanings as proposals, and only persisted ontology meanings as shared; it also returns competency questions, uncertainty, approval gates, and whether active-vault validation actually applies to the analyzed project. The plan distinguishes raw candidates into existing, ambiguous-alias review, and genuinely new buckets, then returns exact reviewCalls for retrieving full rows. side effect 0: this tool never writes markdown. CLI index --apply may write analyzer-proposed concepts and containment, but inferred imports remain review-only and are never auto-promoted to depends_on.
| Name | Required | Description | Default |
|---|---|---|---|
| maxDepth | No | Forwarded to analyze_repo_structure, which ignores it, so no value changes the analysis. When given, it must be an integer from 0 to 10. | |
| maxFiles | No | File cap forwarded to infer_imports (default 5000, max 50000). | |
| rootPath | No | Repository root to index. Defaults to the active resolved repository root from connection_info. | |
| threshold | No | Optional module-edge count threshold for the returned import relation plan. | |
| skipImports | No | When true, skip infer_imports and return an analyze + validate plan only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| next | Yes | |
| plan | Yes | |
| analyze | Yes | |
| imports | Yes | |
| rootPath | Yes | |
| vaultRoot | Yes | |
| sideEffect | Yes | |
| validation | Yes | |
| meaningGate | Yes | |
| semanticEvidence | Yes | |
| extractionContract | Yes | |
| configurationEvidence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnlyHint=true, destructiveHint=false), yet the description goes well beyond them: it states "side effect 0: this tool never writes markdown," explains the extractionContract/evidence-versus-proposal semantics, and clarifies that only the CLI `--apply` path writes (analyzer-proposed concepts and containment) while inferred imports stay review-only and are never auto-promoted to depends_on. That is exactly the mutation/auth/side-effect detail structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the description runs six-plus dense sentences heavy with internal jargon ("extractionContract," "genuinely new buckets," "competency questions") that is costly to parse. It is information-dense rather than padded, but the lack of shortening/structure keeps it from earning a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still summarizes the plan contents (candidate buckets, reviewCalls, competency questions, uncertainty, approval gates, validation applicability), giving the agent a complete mental model. Combined with the read-only annotations, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter (maxDepth, maxFiles, rootPath, threshold, skipImports). The description adds a little routing context (which sub-tool each param forwards to, and the skipImports behavior), but does not add format or semantic detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb+resource (index a project's ontology) and immediately names the three sibling tools it orchestrates (analyze_repo_structure, infer_imports, validate_vault), so an agent can distinguish it from those siblings without reading schemas. The read-only plan scope is explicit up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use for large or already-existing projects where the agent needs a resumable ontology indexing checkpoint before writing" gives a clear triggering condition, and skipImports plus the CLI `index --apply` note sketch the alternative path. It stops short of explicit when-not guidance for smaller projects or a direct compare against calling the three sub-tools individually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
infer_importsARead-only
R17 (autonomous ingest deeper) — walk TS/JS files in a code repo and infer file-level + module-level import edges. It also walks bounded root Python packages, bounded src/source-layout Python packages, and deterministic Rust use/file-module/literal-include dependencies. A valid root Go module additionally exposes typed local package-import evidence; it stays separate from legacy file edges and never self-approves a semantic relation. Structured coverage names the supported languages; Rust support is bounded static text evidence and does not expand macros, evaluate cfg, resolve symbols, or prove runtime impact. side effect 0 (vault frontmatter NOT modified). moduleEdges are source-backed review candidates, never self-approving semantic depends_on relations. When you know an implementation file, set focusPath (or reviewMode:"focus") before considering full: Atlas returns bounded exact incoming/outgoing static import receipts, counts, and a cursor without requiring a vault. This focused source boundary is not runtime impact or a semantic relation. Omit reviewMode for size-safe automatic delivery: scans whose estimated full MCP result is at most 128 KiB keep the complete response; larger reconciled scans return exactly one compact, non-writing nextRelationReview:v1 packet plus a delivery receipt and stateless cursor. Use reviewMode:"next" to request that bounded packet explicitly. reviewMode:"full" preserves the complete shape, but a result over 128 KiB additionally requires allowLargeResponse:true; this second confirmation prevents coding agents from accidentally opting into a multi-megabyte response. Oversized raw scans without a loadable reconciliation vault fail with an actionable error instead of emitting an unbounded default response. Every compact candidate carries absentEndpoints. If an endpoint is missing, nextCalls is empty and endpointModelling separates an evidence-only analysis call from the complete rootPath + proposal validation contract, source-bound drafts, and queue resume. It never calls get_concepts or relation_check on a missing slug, never claims the analysis call created an endpoint, and never promotes a path-derived slug into a business kind or definition. Each module edge includes whole-edge source-role/import-usage counts, productValueCount, kindCounts, and a bounded exact file-edge evidence receipt. Missing vault edges remain rationale_review_required: inspect both concepts and the observed direction, ask the user, then call add_relation with an explicit why. Test-only or type-only evidence stays visible but must not be framed as a product depends_on approval question without separate product meaning evidence. Detects:
relative imports (./, ../) → resolved to file paths
dynamic import() / require() / export ... from
bare side-effect imports (import "X")
apps/* and packages/* workspace imports collapse to analyzer-compatible element slugs
bounded static Python import / from ... import statements in root or src/source-layout packages with init.py; imports nested under an explicit TYPE_CHECKING guard are type_only; source is parsed as text and never executed
external package imports listed separately
tsconfig.json compilerOptions.paths aliases first, then fallback common @/* aliases → resolved to internal files when the target exists; otherwise unresolved as alias-not-found
Use after analyze_repo_structure to pull real dependency edges from the code, not just suggestedRelations heuristics. Unless reconcile:false, also returns reconciliation (+ reconciliationSummary counts): the module edges diffed against the vault's compiled depends_on edges into inBoth / review-required missing edges / inVaultNotInCode (possibly-stale vault edges). Missing edges carry source evidence and a rationale_review_required gate, never a write action. Single source of truth preserved — inspect both concepts, explain why the semantic dependency holds, and ask the user before one explicit add_relation call with why.
| Name | Required | Description | Default |
|---|---|---|---|
| ignore | No | Extra folder names to skip (added to defaults: node_modules, dist, build, …). | |
| maxFiles | No | Positive integer cap on files walked (default 5000, max 50000). Hard stop to avoid pathological monorepos. | |
| rootPath | No | Repository root to analyze. Defaults to the active resolved repository root from connection_info. | |
| focusPath | No | Repository-relative implementation file to inspect. Supplying focusPath with omitted reviewMode selects focus mode automatically. Returns bounded incoming/outgoing supported static import receipts; it does not claim runtime or semantic impact. | |
| reconcile | No | Default true. When true, diff the inferred module edges against the vault's compiled depends_on edges and include `reconciliation` + `reconciliationSummary`. Set false to skip (raw scan only / no vault). | |
| focusLimit | No | Focus mode only. Maximum exact import receipts returned in one page (default 50, max 100). | |
| reviewMode | No | Omit for automatic delivery unless focusPath is present. `focus` returns a bounded exact file-level import neighborhood for focusPath. Otherwise responses estimated at or below 128 KiB keep the complete scan, while larger reconciled scans return one compact, non-writing review packet. `full` requests the complete scan; when it exceeds 128 KiB, also pass allowLargeResponse:true. `next` explicitly requests one compact packet and requires reconciliation. | |
| afterReviewId | No | `reviewMode:"next"` only. Pass the prior packet cursor.nextAfterReviewId to advance deterministically; omit to start at the first current candidate. | |
| sourceFolders | No | Source folders to walk (default: ['src','source','lib','app','apps','packages']). Nested scopes preserve repository-relative ontology endpoints. If none exist, falls back to rootPath. | |
| focusDirection | No | Focus mode only. Which exact file-level import direction to page (default both). | |
| focusAfterEdgeId | No | Focus mode only. Pass the prior focusReview.cursor.nextAfterEdgeId to advance deterministically; omit to start at the first current edge. | |
| allowLargeResponse | No | Confirmation for reviewMode:"full" only. Required when the estimated complete MCP result exceeds 128 KiB. It never changes scan contents or writes the vault. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | No | |
| contract | No | |
| coverage | Yes | |
| delivery | No | Present only when omitted reviewMode was automatically compacted because the estimated full MCP result exceeded the safe delivery boundary. |
| rootPath | Yes | |
| nextReview | No | |
| unresolved | No | |
| focusReview | No | |
| moduleEdges | No | |
| reviewQueue | No | |
| scanSummary | No | |
| filesScanned | Yes | |
| reconciliation | No | Module edges diffed against the vault's compiled depends_on edges (alias-normalized). null when no vault is loadable (e.g. scanning a foreign repo). Absent when reconcile:false. |
| externalImports | No | |
| staleEdgeFollowUp | No | |
| packageImportEvidence | No | Root Go module-only, bounded package import evidence. It is observed static source evidence, never a runtime claim or semantic relation approval. |
| reconciliationSummary | No | |
| packageImportEvidenceSummary | No | Bounded Go package-import census. Call fullEvidenceCall to retrieve the complete typed receipt; focusReview itself contains legacy file edges only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/openWorld=false, and the description adds substantial extra behavior: side effect 0 (vault frontmatter untouched), never self-approving semantic relations, no get_concepts/relation_check calls on missing slugs, actionable errors on oversized raw scans, and the 128 KiB gated response contract. It adds real value beyond annotations, though the idempotentHint=false implication is never explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose acceptably but then sprawls into a dense block with repeated claims (the 'never self-approves a semantic relation' idea appears several times, the 128 KiB limit is restated) and jargon like 'nextRelationReview:v1'. Much of the length is informational but not tightened, so it exceeds what a concise tool doc should be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain return values, and annotations cover the safety profile; what remains — language coverage, review modes, reconciliation semantics, and failure behavior — is all addressed. An agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3; the description compensates further by explaining the 128 KiB delivery threshold, allowLargeResponse's second-confirmation role, reconcile's default/effect, and the focus paging cursors. This is beyond what the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource: 'walk TS/JS files in a code repo and infer file-level + module-level import edges,' then extends to Python/Rust/Go modes. It also explicitly differentiates itself from the sibling analyze_repo_structure ('pull *real* dependency edges from the code, not just suggestedRelations heuristics').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the sequencing rule ('Use after analyze_repo_structure'), gives explicit selection conditions for reviewMode focus/next/full, explains when focusPath should be set before considering full, and describes the reconcile:false opt-out. Alternatives and when-not conditions are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_architectureARead-only
Read one reviewed architecture-profile/v1 document from the active vault, scan the connected repository with the existing bounded static import analyzer, and return an architectureBrief:v1 for humans and coding agents. The profile declares scoped roles, intended dependency rules, and which known import usages those rules govern; source imports remain observed evidence with usage-qualified receipts. The result distinguishes conforms, violated, and unknown, and never treats unsupported languages, unclassified import usage, empty role mappings, or unmapped edges as compliance. Pattern labels are human/document declarations, not folder-name inference. side effect 0.
| Name | Required | Description | Default |
|---|---|---|---|
| maxFiles | No | Positive source-file scan cap (default 5000, max 50000). | |
| rootPath | No | Repository root to inspect. Defaults to the active resolved repository root from connection_info. | |
| profileSlug | No | Architecture profile_slug. Optional only when the vault contains exactly one architecture profile. |
Output Schema
| Name | Required | Description |
|---|---|---|
| profile | Yes | |
| contract | Yes | |
| sideEffect | Yes | |
| conformance | Yes | |
| nextActions | Yes | |
| agentPlanContract | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral nuance beyond that: it never treats unsupported languages, unclassified import usage, empty role mappings, or unmapped edges as compliance, and clarifies that pattern labels come from human/document declarations, not folder-name inference. This directly informs the agent of the tool's conservative, evidence-based behavior, which is highly valuable for correct invocation and interpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each adding distinct value: the core action, the profile's role, the output categories, and the caveat about pattern labels. The description is front-loaded with the primary purpose and ends with a succinct 'side effect 0' note. No filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers the essential context: input requirements (reviewed profile, active vault, connected repo), the scanning mechanism, the output type (architectureBrief:v1), the three result categories (conforms, violated, unknown), and explicit exclusions. The agent has enough information to decide when to invoke it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – every parameter (maxFiles, rootPath, profileSlug) has a description with constraints. The tool description adds no additional meaning about parameters, so it does not go beyond the schema. A baseline of 3 is appropriate since the schema fully documents the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-resource-outcome chain: 'Read one reviewed architecture-profile/v1 document, scan the connected repository with the existing bounded static import analyzer, and return an architectureBrief:v1.' It clearly distinguishes itself from sibling repo-analysis tools (e.g., index_project, analyze_repo_structure) by specifying the profile-based, compliance-focused output. The mention of 'reviewed' and 'bounded' narrows its scope further, so an agent can differentiate it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly conveys when to use it: when a reviewed architecture profile exists in the active vault and a repository is connected. It does not explicitly list alternatives or state when not to use it, but the context is clear enough to guide an agent toward this tool for architecture compliance checks rather than, say, indexing or repository structure analysis. No exclusions are mentioned, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conceptsARead-only
List every ontology node in the vault (each .md file with a frontmatter kind:). Filter by kind, domain, and/or since (mtime-based incremental sync). Large vaults are resumable with offset + limit; always follow pagination.nextOffset while hasMore is true. AI agents call this first to grasp the codebase's mental model.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter to one canonical ontology kind (project, domain, capability, element, document, vault-readme). Omit to return all. Invalid kind typos fail closed with nearest-value hints instead of returning an empty list. | |
| limit | No | Positive integer max rows to return. Defaults to 100, max 500. | |
| since | No | Non-negative mtime threshold. Filter to nodes with `mtime > since` (ms). Pair with the `mtime` returned in earlier `list_concepts` / `get_concept` responses for incremental sync — "what changed since I last looked". Strict greater-than (mtime === since is excluded) so re-passing the max from a previous response does not double-fetch. | |
| domain | No | Filter to nodes whose frontmatter `domain:` matches this slug (e.g. "auth"). Combine with `kind` for "all capabilities under auth" in one call. Use the domain *slug*, not the title. | |
| offset | No | Zero-based page offset applied after kind/domain/since filters. Resume at pagination.nextOffset until hasMore is false; ordering is deterministic by canonical slug. | |
| summary | No | When true, each node row includes a `summary` (max 200 chars, prose-only — heading / table / code block / image / divider / list / quote are skipped and only the first paragraph is kept, same `extractSummaryExcerpt` helper as `get_concept` / `find_evidence`). Useful for "scan + overview" without N follow-up `get_concept` calls. Default false to keep payload small. |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodes | Yes | |
| total | Yes | Total number of matching ontology nodes before the limit is applied. |
| limited | Yes | True when this page does not contain every matching row. |
| returned | Yes | Number of rows returned in this page. |
| vaultRoot | Yes | Resolved vault root path used for the listing. |
| pagination | Yes | |
| summaryHint | No | Only present when at least one row carries a partial summary — names the follow-up call that returns the full bodies. |
| vaultWarnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail beyond annotations: pagination semantics ('always follow pagination.nextOffset while hasMore is true'), incremental sync via mtime, and resumability for large vaults. This gives the agent practical execution guidance without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with zero filler. It front-loads the core purpose, then packs filter, pagination, and intended usage into compact, high-value clauses. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and annotations, the description covers everything an agent needs: what the tool returns, how to filter, how to paginate, and when to call it. The incremental sync and pagination protocol are both stated clearly, so no critical behavioral gap remains for this list-style read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents every parameter thoroughly, including enums, defaults, and filter behavior. The description adds a high-level summary of filtering ('Filter by kind, domain, and/or since') and pagination, but does not need to repeat schema details. Baseline 3 is appropriate because the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'List every ontology node in the vault', with a precise definition ('each .md file with a frontmatter kind:'). This clearly distinguishes it from sibling tools like list_kinds (which lists kinds) and get_concepts (which fetches specific concepts). The scope is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states a primary usage context: 'AI agents call this first to grasp the codebase's mental model.' It also explains when to use pagination and incremental sync. However, it does not explicitly say when to prefer alternatives such as list_kinds or get_concepts, so usage guidance is strong but not fully exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_constellationsARead-only
List saved constellation metadata from this configured vault only. Returns bounded names, user-purpose state, timestamps, member counts, exact sidecar revision, and honest unavailable status for missing/corrupt/unsupported data. Saved membership is task scope, not an ontology relation, review decision, or complete impact claim.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum metadata rows to return. Defaults to 50; maximum 100. | |
| offset | No | Zero-based offset in deterministic saved-constellation order. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| source | Yes | |
| limited | Yes | |
| contract | Yes | |
| guidance | Yes | |
| returned | Yes | |
| pagination | Yes | |
| availability | Yes | |
| constellations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds valuable behavioral context beyond annotations: it discloses that the tool returns 'honest unavailable status for missing/corrupt/unsupported data' and clarifies that membership is task scope rather than an ontology relation. This prevents misinterpretation of the data's meaning, which annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense paragraph of three sentences. It front-loads the primary purpose and includes essential qualifiers without excessive verbosity. The structure is clear and every sentence contributes meaning, though the density could be slightly briefer for maximum readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description need not detail return values, yet it still specifies key output fields (names, timestamps, member counts, etc.) and the honest status handling. It also clarifies the important semantic boundary ('task scope, not ontology relation'), which is essential for correct tool selection. The tool's simplicity and the presence of an output schema mean the description is complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes both parameters (limit and offset) with clear descriptions, achieving 100% schema description coverage. The description does not add additional parameter-level semantics, so the baseline of 3 is appropriate; it neither compensates for gaps nor adds extra value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (list) and resource (saved constellation metadata from this configured vault only). It specifies the exact fields returned and distinguishes its scope from broader ontology concepts by clarifying that saved membership is task scope, not an ontology relation. This differentiates it from siblings like list_concepts and get_constellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by stating 'from this configured vault only,' which suggests it is scoped to a specific vault, but it does not explicitly state when to use this tool versus alternatives like get_constellation or list_concepts. The semantic caveat about task scope provides some context but not direct usage guidance or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_kindsARead-only
Vault kind distribution — { total, byKind: { capability: N, ... } }. A quick census so AI agents can size up the vault without paging through list_concepts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total number of vault docs that declare a kind. |
| byKind | Yes | Node counts keyed by frontmatter kind. |
| referencedOnlyTotal | Yes | Number of slugs referenced by graph relations without a corresponding node document. |
| conceptsIncludingReferenced | Yes | Documented nodes plus referenced-only slugs, matching the graph-visible concept census. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive profile. The description adds that this is an aggregate census returning total and per-kind counts rather than a paged list, which is useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: the first front-loads the output shape, the second adds the use case and sibling distinction. Every word contributes to understanding the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only census, the description gives the purpose, the return shape, and the relationship to list_concepts. An output schema exists for the return value, so the description does not need to document the response fields further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there are no parameter semantics to describe. The baseline of 4 applies because the description correctly leaves the input side untouched and the schema already covers it entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that the tool returns vault kind distribution with total and byKind counts, and differentiates it from list_concepts by positioning it as a quick census. It is clear, though it uses a noun phrase ('Vault kind distribution') rather than an explicit verb like 'list' or 'summarize'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says to use this tool for a quick census to size up the vault, and contrasts it with paging through list_concepts. It implies the alternative for item-level traversal but does not explicitly say 'use list_concepts when you need detailed concept listings.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_conceptsADestructive
⚠ DESTRUCTIVE MULTI-FILE WRITE — fold one node into another. Every backlink to fromSlug is redirected to intoSlug (frontmatter array entries + body links), then fromSlug is deleted. The survivor keeps its UID while the source UID/history is recorded in canonical merged_uids. The intoSlug prose and non-identity frontmatter are preserved as-is — they are not merged automatically (use patch_concept after if you want to combine descriptions). Tail-only references are also redirected. Two-stage safety:
Without confirm: true the call is a dry-run — returns the redirect plan + list of deletions without writing.
With confirm: true the rewrites and the delete happen in one pass. Throws if either slug is missing. Confirmed writes return compact
postWriteMaintenance(maintenance_plan) with count-safebyPhase/bySeverity/byKindqueue buckets, actionscore, executableproposedAction, and current-pagenextExecutableAction/nextReviewActionpointers for the final graph.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Actually perform the merge when true. Omit or false for a dry-run. | |
| fromSlug | Yes | Slug to dissolve. Its file is deleted after backlinks redirect. | |
| intoSlug | Yes | Slug to keep. Receives every redirected backlink. | |
| expected_mtime | No | Optional conflict guard for fromSlug. Throws if the source has been modified externally. | |
| expected_into_mtime | No | Optional conflict guard for intoSlug. Pass the survivor mtime from get_concept so a concurrent edit or identity-history change is never overwritten. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| dryRun | Yes | |
| changed | No | |
| deleted | Yes | |
| fromUid | Yes | |
| intoUid | Yes | |
| message | No | |
| fromPath | Yes | |
| fromSlug | Yes | |
| intoSlug | Yes | |
| warnings | No | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| absorbedUids | Yes | |
| capturedFrom | Yes | |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| backlinkUpdates | Yes | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: it names exactly what is destroyed (fromSlug file), what is preserved (survivor UID, source UID/history in merged_uids), what is NOT merged automatically (prose and non-identity frontmatter), the dry-run safety stage, and the throw condition on missing slugs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive warning and the core mechanic are front-loaded, and the numbered safety stages are scannable. It runs long, with the postWriteMaintenance detail bordering on redundant against the output schema, but nearly every sentence carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive multi-file mutation with conflict-guard params, the description covers the write path, the dry-run path, identity preservation, failure modes, and follow-up routing. An output schema exists, so its added return-value prose is surplus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic weight: it clarifies that confirm governs the dry-run-versus-write boundary and that omitting it preserves the redirect plan, which contextualizes how the required slugs are actually consumed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'fold one node into another,' with the exact mechanical consequence spelled out (backlinks redirected, fromSlug deleted, survivor keeps its UID). It clearly differentiates from siblings like delete_concept and rename_concept, which perform single-file operations without the multi-file merge semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to patch_concept for combining descriptions after the merge, and it explains the two-stage confirm flow (dry-run without confirm, single-pass write with it). It does not, however, contrast when to merge versus rename or delete, leaving one inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_conceptA
Update the frontmatter and/or body of an existing ontology node. Use when an AI agent revises, deepens, or reclassifies a node. Frontmatter patches are key-by-key — null deletes a key, omission preserves it. Body is fully replaced when provided, otherwise preserved. Pass expected_mtime (from the previous get_concept response) to detect concurrent external edits — throws VaultConflictError if the file has changed on disk since you read it. Changed writes return compact postWriteMaintenance (maintenance_plan) with count-safe byPhase / bySeverity / byKind queue buckets, action score, executable proposedAction, and current-page nextExecutableAction / nextReviewAction pointers so agents can immediately continue graph cleanup.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Full replacement markdown body (optional). Preserved when omitted. | |
| slug | Yes | Vault-relative slug (omit the .md extension). | |
| frontmatter | No | Frontmatter key/value patches (e.g. { kind: "capability", domain: "views" }). null removes the key. Per-locale display names go here as `display_ko` / `display_en` — fill every locale the vault serves so both audiences read a native name (`title` stays the search/matching source). | |
| expected_mtime | No | Optional conflict guard. If the file mtimeMs differs at write time, the call throws so the caller can re-read and retry. Pass the `mtime` field from the most recent get_concept response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| slug | Yes | |
| changed | Yes | |
| filePath | Yes | |
| postWriteMaintenance | Yes | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations, detailing the exact merge semantics (key-by-key frontmatter patching, null deletion, omission preservation, full body replacement vs. preservation). It discloses the VaultConflictError mechanism and describes the postWriteMaintenance return structure with actionable fields. Annotations only indicate it's a write and non-destructive, but the description adds rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively long but each clause earns its place: purpose, usage, merge semantics, conflict handling, and return maintenance details. It's front-loaded with the core action, and the density of useful information outweighs any verbosity. Could be trimmed slightly, but no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available, the description correctly focuses on behavior not return format. It covers the patching rules, conflict detection, and the maintenance plan hooks. Minor omissions like validation rules for frontmatter values are acceptable given the schema and sibling tools. For a complex mutating operation, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds critical nuance not present in the schema: the frontmatter patch semantics (null deletes, omission preserves), body replacement rules, and the origin/usage of expected_mtime ('from the previous get_concept response'). This transforms bare parameter definitions into actionable contracts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Update the frontmatter and/or body of an existing ontology node.' This clearly distinguishes it from sibling tools like add_concept (creation) and delete_concept (removal). The scope is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use when an AI agent revises, deepens, or reclassifies a node.' It does not list alternatives or exclusions (e.g., don't use for new nodes), but the context is clear enough. The mention of expected_mtime for conflict detection provides concrete guidance on safe use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_conceptsARead-only
Typed filter DSL — search vault nodes by predicate. Built for saved-filter / smart-list cases that find_path (BFS) cannot answer, such as "which capabilities have zero elements?", "stub-only nodes in domain=auth", or "has(depends_on) excluding vault-readme".
Grammar (case-insensitive keywords, whitespace-tolerant): filter := atom (AND|OR atom)* atom := NOT? predicate predicate := key=value | key!=value | has(key)
Keys: kind / domain / slug / title for equality, plus any graph frontmatter array key for has(...). kind and has(...) keys are enum-validated with nearest-value hints.
Example: kind=capability AND domain=auth AND NOT has(elements) — capabilities under domain auth that have zero elements (= unfinished caps). When total=0, the response includes a growthHint — it names any referenced kind/domain that has 0 nodes in this vault, or nudges you to loosen the filter.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Positive integer max rows to return. Defaults to 100, max 500. | |
| filter | Yes | Filter expression. Example: kind=capability AND has(elements). Supports NOT / AND / OR. Wrap values containing whitespace or special characters with "..." or '...'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| filter | Yes | |
| limited | Yes | |
| matches | Yes | |
| parsedAs | Yes | |
| growthHint | No | Only present when total=0 — flags a referenced kind/domain with 0 nodes in this vault census, or a generic loosen-the-filter nudge otherwise. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description goes further: it explains the grammar (case-insensitive, whitespace-tolerant), enum validation with nearest-value hints, and the special growthHint behavior when total=0. This adds rich behavioral context beyond what annotations provide, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though it is longer than typical descriptions, the length is fully earned: a DSL grammar cannot be conveyed in a sentence. The structure is logical — purpose, grammar, keys, example, special case — and front-loads the most critical scoping information. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param tool with an output schema, the description covers everything needed to invoke correctly: it explains the DSL grammar, valid keys, the limit default (via schema), the growthHint edge case, and even gives query examples. The contrast with find_path removes selection ambiguity. Nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both params are already documented. The description adds substantial meaning beyond the schema: it defines the full filter grammar, supported keys, and gives a working example. It also clarifies that kind and has(...) keys are enum-validated, which the schema does not mention. This far exceeds the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'search vault nodes by predicate' and immediately frames its niche as saved-filter/smart-list cases. It explicitly names the sibling (find_path) that it is not, making distinction trivial. Examples like 'which capabilities have zero elements?' ground the purpose concretely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use it ('saved-filter / smart-list cases') and when not to ('find_path (BFS) cannot answer'), and provides concrete example queries. It makes the selection rule explicit rather than implied, leaving no ambiguity about the target use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_ontologyARead-only
Analysis archive: analysis_history reads immutable diagnostic Markdown summaries without compiling the graph; use analysisMode, project, limit (1–100 scanned files, default 30), and analysisCursor. analysis_record reads one exact run or review with recordId (UUID). Records retain raw answers, full-body evidence when available, request scope and uncertainty. They are not approved ontology facts; stored qualification describes captured evidence, never current source validity. Reviews are joined to their exact run/finding id. Follow pagination even if a filtered page is empty. These archive operations do not support query_plan. Run graph-engine queries over the freshly compiled ontology artifact. Operations: neighbors (local graph neighborhood), path (one compiled-edge route between two nodes with aligned nodes[] summaries), all_paths (bounded simple paths between two nodes with per-path nodes[] summaries plus limit/searchBudget/exhaustive/truncatedByBudget/totalPathsExact metadata and evidence guidance), query_plan (EXPLAIN-style side-effect-free cost/index estimate plus execution advice before a target operation, filter-preserving suggestedQuery, and filter-aware estimate.totalMatches for match_nodes/match_edges), centrality (PageRank-style core-node ranking plus bridge/authority/hub lists), communities (label-propagation clusters inside the graph), similar_nodes (duplicate/overlap candidates before writes), explain_relation (direct edges, shortest path, and shared-neighbor explanation between two nodes), reachability (transitive graph closure from a start node), pattern_walk (explicit relation-sequence paths such as project → domains → capabilities), impact (incoming by default: what depends on this node), blast_radius (impact grouped by kind/domain with cross-domain edge risk), subgraph (bounded N-hop graph slice for UI/agent views), builder_context (persisted Workshop focus, layout positions, direct graph slice, and safe write handoff; unsaved UI drafts are explicitly excluded; operation name retained for compatibility), overview (counts, relation distribution, and hubs), schema (kind-relation-kind patterns), facets (filter/dashboard aggregates), match_nodes (graph DB-style node rows with degree filters plus a followUp packet for the first returned row), match_edges (graph DB-style edge pattern rows plus a followUp packet for the first returned real edge), node_profile (single node detail dashboard), domain_profile (domain detail dashboard), domain_matrix (domain-to-domain coupling), project_scope (project-contained graph slice), project_map (domain-by-domain project map), relation_check (schema-aware preflight before add_relation), components (connected graph islands), lineage and containment_tree (project/domain/capability containment), cycles (directed dependency-cycle checks), topological_order (prerequisite-first dependency ordering), recommend_relations (safe domain-containment suggestions), growth_plan (side-effect-free ontology expansion candidates, plus a nextReads group that turns the ## Uncertainty section of each node into the reads it asks for: kind, the statement as written, the paths and line ranges it names, and a one-sentence proposed read plus patch_concept, ordered cheapest-first and reporting reason: no_bodies when no node bodies were loaded), maintenance_plan (ordered post-write graph cleanup/repair actions with stable action id, count-safe summary fields, byPhase / bySeverity / byKind remaining-queue buckets, ready cursor cursor.found=true / cursor.reason=null, cursor nextAfterActionId/hasMore pagination metadata, afterActionId resume, unknown-cursor empty page with cursor.nextAfterActionId=null / cursor.hasMore=false, kind filters, executable graph-array canonicalization, executable flags, and current-page nextExecutableAction / nextReviewAction pointers), agent_brief (Claude Code/Codex handoff prompt, structured businessOntologyLens with business-first outcome → domain → capability → element read order, graphDbQueryPack for facets, schema, match_nodes, match_edges, domain_matrix, centrality, all_paths, explain_relation, and business_questions scans for outcome / domain boundary / capability claim nodes / implementation evidence edges, structured cliFallbackCommands, recipes, graph entrypoints, graph_traversal playbook, traversalStrategy plan_before_enumeration/bounded_path_evidence/containment_cross_check guidance, playbook evidence/stopWhen checklists, write guardrails, relationDecisionGuide, resultContracts for all_paths completeness and match_nodes/match_edges followUp evidence, and read-first write policy), meaning_repair_review (provenance-bound, byte-bounded typed evidence pages and literal full-body read calls for the compact meaning repair manifest), workspace_brief (first-contact status + next actions), and health (one-shot graph integrity dashboard whose relationCensus labels compiler declaration counts and the nonnumeric canonical app-map comparison unit). For agent_brief, select project explicitly when the vault has more than one project. Omitted detail and detail:"full" return the complete project-scoped diagnostic contract. For a known coding task, call detail:"compact" directly after connection_info; do not precede it with workspace_brief or a full inventory unless the question needs whole-vault health. Compact v2 requires a nonblank request-local task (max 2000 characters) and returns at most 12000 UTF-8 JSON bytes: final source/meaning currentness, claim-compatible broad capability selection, persisted element/path evidence, explicit unknown impact and verification, exact full-body next reads, and a detail:"full" follow-up. Definition and Includes support desired work; Excludes may align with explicit non-goals, while a desired/negative boundary conflict, an unsupported claim, or a tied top claim returns no capability. Its content[0].text is the bounded handoff prompt while structuredContent carries the typed facts once. When the selected element Markdown contains reviewed Primary implementation / Supporting implementation / Focused test coordinates and the bound source is current, taskNavigation verifies only those named files and returns exact current lines plus the reviewed non-exhaustive IN/OUT boundary. After those reads, Atlas rechecks the same source identity, fingerprint, revision, and graph hash; any mismatch removes the exact target and downgrades the complete outer currentness contract. A ready prompt reads primary, supporting, focused tests, and a verified manifest together; requires named positive and negative regression tests with exact observable output; and runs the focused check once followed by one non-overlapping full check. Missing, ambiguous, stale, unsafe, or unrecorded coordinates emit no exact target. Task matching selects evidence only; it never searches the repository, never proves source behavior, never persists task text, never approves meaning, and never writes the vault. For impact and blast_radius, only declared depends_on is allowed; use reachability/subgraph for structure. Blast radius reports unknown risk/completeness plus review_required or declared_with_rationale edge qualification until relation-level source receipts exist. A missing depends_on preflight is schema-only: relation_check returns proposedAction:null plus a non-writing approvalGate until the agent explains the observable ability and semantic rationale and receives explicit human approval. Accepts canonical slugs or unique aliases. side effect 0. Use this when you need graph-database-like answers without pulling the full compile_ontology payload.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Target node slug or unique alias. Required for path, all_paths, and explain_relation. | |
| from | No | Source node slug or unique alias. Required for path, all_paths, and explain_relation. | |
| kind | No | match_nodes: optional node kind filter (project, domain, capability, element, document, vault-readme). recommend_relations currently supports capability or element. | |
| seed | No | Alias for slug when operation is subgraph or builder_context. | |
| slug | No | Center/root node slug or unique alias. builder_context also accepts its own canonical Workshop focusParam (for example domain:auth). Required for neighbors, reachability, pattern_walk, impact, blast_radius, subgraph, builder_context, lineage, node_profile, and domain_profile; optional root for containment_tree. | |
| sort | No | match_nodes only: sort rows by degree, inDegree, outDegree, or slug. Defaults to degree. | |
| task | No | agent_brief detail:"compact" only: request-local coding task used to select persisted capability, element, and reviewed navigation evidence after Definition/Includes/Excludes compatibility. Conflicting, unsupported, or tied claims return no capability. Never persisted, never used to invent a coordinate, and never treated as behavior proof or semantic approval. | |
| type | No | Relation type for relation_check/match_edges, e.g. depends_on, relates, contains, describes, domains, capabilities, elements, or domain. | |
| depth | No | reachability/impact/blast_radius/subgraph/lineage/containment_tree traversal depth. Defaults to 3 for reachability, 2 for impact/blast_radius/subgraph, and 20 for lineage/containment_tree; capped at 20. | |
| kinds | No | maintenance_plan only: optional action-kind filter, e.g. ["add_missing_relation", "canonicalize_graph_arrays"]. | |
| limit | No | Positive integer max rows/components/order entries to return. Defaults to 100, capped at 500. | |
| title | No | similar_nodes only: proposed title for a not-yet-written concept candidate. | |
| types | No | Optional relation types to include, e.g. ["dependencies"] or ["depends_on"]. | |
| cursor | No | meaning_repair_review only: opaque stateless cursor returned as pagination.nextCursor. Omit for the first page. | |
| detail | No | agent_brief only: compact v2 returns a task-scoped, selected-project handoff capped at 12000 UTF-8 JSON bytes, including exact reviewed taskNavigation only when the bound source is current; full returns the complete diagnostic manuals and graph packs. Omit to keep the current full response while compact is being qualified. | |
| domain | No | match_nodes: optional exact domain filter. domain_profile: domain root slug or unique alias. | |
| phases | No | maintenance_plan only: optional phase filter, e.g. ["repair", "link", "materialize"]. | |
| toKind | No | match_edges only: optional target kind filter (project, domain, capability, element, document, vault-readme, external, unresolved). Use external or unresolved for non-node refs. | |
| maxHops | No | path/all_paths/explain_relation traversal hop cap or cycles max depth. Defaults to 5 for path/all_paths/explain_relation and 8 for cycles; capped at 20. | |
| pattern | No | pattern_walk only: required relation sequence to follow, e.g. ["domains", "capabilities", "elements"]. depends_on is normalized to dependencies. | |
| project | No | domain_matrix/project_scope/project_map/agent_brief/meaning_repair_review: project root slug or unique alias. Required for meaning_repair_review; optional when exactly one kind: project node exists for the other operations. | |
| fromKind | No | match_edges only: optional source node kind filter (project, domain, capability, element, document, vault-readme). Source must be a real ontology node, not external/unresolved. | |
| recordId | No | analysis_record only: immutable analysis or diagnostic-review UUID. | |
| relation | No | Alias for type when operation is relation_check. | |
| direction | No | neighbors/reachability/impact/blast_radius/subgraph/builder_context: incoming, outgoing, or both. path/all_paths/explain_relation/reachability also accepts undirected. | |
| itemLimit | No | project_map only: positive integer max capability/element/hotspot summaries per domain. Defaults to 20, capped at 500. | |
| maxDegree | No | match_nodes only: non-negative integer maximum total graph degree. | |
| minDegree | No | match_nodes only: non-negative integer minimum total graph degree. | |
| nodeLimit | No | components/communities/health/workspace_brief/agent_brief only: positive integer max node summaries per component/community group. Defaults to 25 for components/communities and 10 for health, capped at 500. | |
| operation | Yes | Query operation to run. | |
| cycleLimit | No | health/workspace_brief/agent_brief only: positive integer max dependency cycles to inspect. Defaults to 5, capped at 500. | |
| iterations | No | centrality/communities only: positive integer PageRank or label-propagation iteration count. Defaults to 20, max 100. | |
| orderLimit | No | health/workspace_brief/agent_brief only: positive integer max topological-order rows to inspect. Defaults to 20, capped at 500. | |
| severities | No | maintenance_plan only: optional severity filter, e.g. ["fail", "warn"]. | |
| hasIncoming | No | match_nodes only: require presence or absence of incoming graph edges. | |
| hasOutgoing | No | match_nodes only: require presence or absence of outgoing graph edges. | |
| minInDegree | No | match_nodes only: non-negative integer minimum incoming graph degree. | |
| analysisMode | No | analysis_history only: optional analysis subject filter. | |
| minOutDegree | No | match_nodes only: non-negative integer minimum outgoing graph degree. | |
| searchBudget | No | all_paths, query_plan(all_paths), and cycles: maximum DFS states to expand before returning partial results. Defaults to 5000. For cycles, `limit` trims only the listed rows and this budget is the one bound that can cut the count short — when truncatedByBudget is true, totalCycles is a lower bound and zero cycles does NOT mean acyclic (check totalCyclesExact). | |
| slugContains | No | match_nodes only: optional case-insensitive substring filter on canonical slug. | |
| afterActionId | No | maintenance_plan only: stable action id cursor; return actions after this id. Without afterActionId the ready page reports cursor.found=true and cursor.reason=null; cursor.nextAfterActionId matches the last returned action id (or null for an empty page), and cursor.hasMore matches whether more remaining actions exist after this page. nextExecutableAction/nextReviewAction point only at the first executable/review action in the current returned page and preserve that action id, executable flag, phase, kind, and severity. Bucket totals (byPhase, bySeverity, byKind) match remainingActions for the returned cursor. Unknown cursors return an empty page with cursor.found=false, cursor.reason, zero remaining actions, cursor.nextAfterActionId=null, cursor.hasMore=false, and no next actions. | |
| candidateSlug | No | similar_nodes only: proposed slug for a not-yet-written concept candidate. | |
| analysisCursor | No | analysis_history only: nextCursor from the preceding scanned-file page. | |
| componentLimit | No | health/workspace_brief/agent_brief only: positive integer max connected components to inspect. Defaults to 5, capped at 500. | |
| componentTypes | No | health/workspace_brief/agent_brief only: relation types used for connected-component checks. Defaults to the full graph relation set. | |
| executableOnly | No | maintenance_plan only: when true, return only actions with a proposed tool call. | |
| includeOrphans | No | containment_tree only: include ancestorless nodes not reached from project roots. Defaults false. | |
| reviewRevision | No | meaning_repair_review only: sha256 revision from meaningRepair:v2, binding graph/source/typed rows/target mtimes. | |
| dependencyTypes | No | health/workspace_brief/agent_brief only: dependency relation types used for cycle and topological-order checks. Defaults to ["dependencies"]. | |
| includeExternal | No | neighbors only: include external path-like element refs. Defaults false. | |
| includeIsolated | No | topological_order only: include nodes that are not connected by the selected relation types. Defaults false. | |
| targetOperation | No | query_plan only: read-only graph operation to explain before execution. Excludes query_plan, meaning_repair_review, analysis_history and analysis_record. | |
| expectedGraphHash | No | meaning_repair_review first page: exact graphHash from meaningRepair:v2 provenance. Later nextCall values are revision-bound and omit it. | |
| includeUnresolved | No | neighbors only: include dangling unresolved refs. Defaults false. | |
| recommendationLimit | No | health/workspace_brief/agent_brief only: positive integer max relation recommendations to inspect. Defaults to 20, capped at 500. | |
| expectedSourceFingerprint | No | meaning_repair_review first page: exact current sourceFingerprint from meaningRepair:v2 provenance. Later nextCall values are revision-bound and omit it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| operation | Yes | |
| compiledSummary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false already in annotations, the description adds meaningful context beyond safety: archive records are immutable, 'not approved ontology facts,' reviews are joined to exact run/finding ids, pagination should be followed even when a page is empty, task text is never persisted, and several operations are side-effect-free. It does repeat 'side effect 0' from annotations, but the amount of non-redundant operational behavior disclosed is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sprawling block that opens with archive details rather than the primary purpose, then runs through a dense catalog of every operation. Many clauses are necessary for a 39-operation tool, but the total is poorly front-loaded and lacks structural markers, making it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity operation-based tool with an output schema, the description covers the full operation set, usage constraints, behavioral caveats, and write guards. Since output schema exists, return values need not be explained, and the description's remaining details are sufficient for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 57 parameters in detail. The description adds operation-level usage context (e.g. analysisMode/project/limit/analysisCursor for analysis_history, recordId for analysis_record, task limits for agent_brief compact), but does not meaningfully extend the per-parameter semantics beyond what the schema provides. Baseline 3 is appropriate when the structured schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run graph-engine queries') and resource ('freshly compiled ontology artifact') and enumerates all 39 operations. It explicitly distinguishes itself from compile_ontology by saying 'without pulling the full compile_ontology payload' and from non-graph read operations like read_source. An agent can tell what this tool is for and what it is not for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use this when you need graph-database-like answers without pulling the full compile_ontology payload.' It names alternatives and constraints, e.g. 'For impact and blast_radius, only declared depends_on is allowed; use reachability/subgraph for structure' and 'do not precede it with workspace_brief or a full inventory unless the question needs whole-vault health.' Operation-level routing is also specified, such as relation_check as a preflight before add_relation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sourceARead-only
Vault source documents only; repository code is read through analyze_repo_structure sourceReads. Read the text of one raw source under sources/, cut into the units a wiki citation names (docs/ONTOLOGY-ATLAS-SPEC.md §11): a DOCX by heading (h:<slug>; paragraphs before the first heading are p1), an XLSX by sheet and row (s<n>r<m>), a CSV by row (r<n>), a text or HTML file by line (l<n>). Each unit carries the exact anchor to write into [[src:sources/<file>#<anchor>]], so a page cites what it quotes. A PDF returns no text: the agent runtime reads PDFs natively, page by page, and cites #p<n>. Nothing is converted and kept — the file is read on request and the text returned once. Paging: from (1-based unit index) and limit (default 200, max 1000); when truncated is true, next is the from to continue with. sheet narrows a workbook to one sheet number. Returns { path, format, unitCount, from, units: [{anchor, text, kind, heading?, sheet?}], truncated, next?, sha256, note? }. side effect 0. Use it in place of a shell command when a Compile, Check or ask turn needs what a DOCX or XLSX says.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | 1-based index of the first unit to return. Default 1. | |
| path | Yes | Vault-relative path under `sources/` (`sources/plan.docx`). | |
| limit | No | Units to return at most. Default 200. | |
| sheet | No | XLSX only: return one sheet, by its number in workbook order. |
Output Schema
| Name | Required | Description |
|---|---|---|
| from | Yes | |
| next | No | |
| note | No | |
| path | Yes | |
| units | Yes | |
| format | Yes | |
| sha256 | Yes | |
| truncated | Yes | |
| unitCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/destructiveHint annotations, disclosing that nothing is converted and kept, that PDFs return no text, that the file is read on request and returned once, how paging/truncation works, and that the side effect is zero. No contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and long, but every sentence earns its place: scoping, unit definitions, PDF caveat, persistence behavior, paging, and when to use it. It is front-loaded with the most important distinction first, but the sheer volume of detail keeps it from being maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and sibling context, the description is complete. It explains unit kinds, anchor citation format, paging, the PDF exception, and the non-persistent read behavior—leaving no decision-relevant gap for an agent trying to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters with 100% coverage, so the baseline is 3. The description adds meaningful semantics on top: how units are indexed per file type, what anchors look like, how `from`/`limit`/`truncated`/`next` interact, and the `sheet` narrowing behavior. That added context justifies a 4 rather than a flat baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise scope boundary ('Vault source documents only; repository code is read through analyze_repo_structure') and names a specific verb and resource: 'Read the text of one raw source under sources/'. It distinguishes itself from sibling tools by defining exactly what it does and what it does not cover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use it in place of a shell command when a Compile, Check or ask turn needs what a DOCX or XLSX says.' It also gives an alternative for repository code, analyze_repo_structure, and warns that PDFs are not handled here because the runtime reads them natively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reclassify_conceptADestructive
⚠ MULTI-FILE WRITE — change a concept kind and optionally its canonical slug/domain in one previewable transaction. The permanent UID is preserved. Redirects backlinks like rename_concept, and a referrer that lists the node under domains/capabilities/elements moves the entry to the list for the new kind when its own kind keeps that list; otherwise the entry stays and warnings names it. Replaces a generated starter body with the new kind template while preserving custom prose. Defaults to dry-run.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Optional explicit replacement body. | |
| slug | Yes | Current canonical slug. | |
| domain | No | New domain; required for capability/element. | |
| confirm | No | ||
| newKind | Yes | ||
| newSlug | No | Optional new canonical slug. | |
| expected_mtime | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| uid | Yes | |
| dryRun | Yes | |
| changed | Yes | |
| newKind | Yes | |
| newSlug | Yes | |
| oldKind | Yes | |
| oldSlug | Yes | |
| warnings | No | |
| bodyAction | Yes | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| sourcePath | Yes | |
| targetPath | Yes | |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| backlinkUpdates | Yes | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-idempotent, and the description adds a lot beyond them: MULTI-FILE WRITE, previewable transaction, dry-run default, UID preservation, backlink redirection, referrer-list movement, body-template replacement, and a `warnings` field. This is exactly the extra consequence detail a mutation needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the most important signal (the ⚠ MULTI-FILE WRITE warning and dry-run default), and most sentences earn their place. The referrer-list sentence is dense and hard to parse, which mildly hurts readability but not overall economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-file mutation with annotations and an output schema (so return values are covered), the description discloses consequences, dry-run behavior, and the warnings field. The main gap is the unexplained expected_mtime parameter and slightly ambiguous list-movement condition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 57%, and the description compensates by explaining newKind/slug/domain/newSlug semantics, the body replacement rule, and the dry-run default tied to confirm. Only expected_mtime (optimistic-concurrency token) is left unexplained, so it adds meaningful value above the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (change a concept's kind, optionally slug/domain) and explicitly frames it against a sibling by referencing rename_concept's backlink behavior. An agent can distinguish it from rename_concept/patch_concept without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It compares itself to rename_concept for backlink redirects and notes the dry-run default, which gives context. However, it never states the condition that should make an agent choose reclassify_concept over rename_concept, patch_concept, or merge_concepts, so when-to-use is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_relationADestructiveIdempotent
Safely remove one exact typed relation and its relation_notes rationale from a source node. Defaults to dry-run; pass confirm:true to write. Supports expected_mtime conflict protection. Use this instead of replacing a whole frontmatter array with patch_concept.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target slug. | |
| from | Yes | Source slug. | |
| type | Yes | ||
| confirm | No | Actually remove when true; default is dry-run. | |
| expected_mtime | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| to | Yes | |
| key | Yes | |
| from | Yes | |
| type | Yes | |
| dryRun | Yes | |
| exists | Yes | |
| changed | Yes | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| removedRationale | No | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. The description adds valuable context beyond annotations: the default dry-run, the confirm flag to write, the expected_mtime conflict protection, and the removal of relation_notes. This is useful behavioral detail without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The primary purpose and safety behavior are front-loaded, and the alternative is stated concisely. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, safety, the alternative, and conflict protection. It has an output schema, so return values don't need explanation. It doesn't explicitly state idempotency, but the annotation covers that. The only minor gap is a more detailed explanation of the type parameter, but the enum is self-explanatory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%: from, to, and confirm have descriptions, but type and expected_mtime do not. The description adds meaning for expected_mtime by mentioning 'expected_mtime conflict protection,' but type is only an enum without further explanation. Since coverage is moderate, the description partially compensates but doesn't fully elaborate all parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('remove one exact typed relation and its relation_notes rationale') on a specific resource (a source node). It clearly distinguishes from patch_concept by explicitly saying 'Use this instead of replacing a whole frontmatter array with patch_concept.' This meets the high bar for purpose clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit alternative (patch_concept) and a clear directive to use this tool instead. It also communicates the default dry-run behavior and the confirm flag for writing. However, it doesn't contrast with other relation tools like replace_relation or add_relation, so it's not a full when-to-use/when-not-to-use guide, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_conceptADestructive
⚠ MULTI-FILE WRITE — change a slug and update every backlink in one atomic graph-level operation. The node UID is preserved; only its current human-readable slug changes. Renames the .md file (oldSlug → newSlug, directory move OK), updates the moved file's frontmatter slug: key, and rewrites every backlink — frontmatter array entries (capabilities / elements / dependencies / relates / contains / describes), inline-string keys, and body links [[oldSlug]] / (oldSlug.md). Tail-only references (mcp-server for capabilities/mcp-server) are also redirected to the new tail. Two-stage safety:
Without confirm: true the call is a dry-run — returns
updates(each affected file with before/after array keys + bodyChanged flag) without writing.With confirm: true the file is moved and all backlinks are rewritten in one pass. Throws if oldSlug missing or newSlug already taken (unless overwrite: true). Use this instead of patch_concept + N find_backlinks + N patch_concept loops. Confirmed writes return compact
postWriteMaintenance(maintenance_plan) with count-safebyPhase/bySeverity/byKindqueue buckets, actionscore, executableproposedAction, and current-pagenextExecutableAction/nextReviewActionpointers for the final graph.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Actually perform the rename when true. Omit or false for a dry-run preview. | |
| newSlug | Yes | Target vault-relative slug (omit the .md extension). Directories are created if needed. | |
| oldSlug | Yes | Current vault-relative slug (omit the .md extension). | |
| overwrite | No | Allow overwriting an existing file at newSlug. Defaults to false (throws if newSlug exists). | |
| expected_mtime | No | Optional conflict guard for oldSlug. Pass the `mtime` from get_concept; throws VaultConflictError if the source has been modified externally since you read it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| uid | Yes | |
| moved | Yes | |
| dryRun | Yes | |
| changed | No | |
| message | No | |
| newSlug | Yes | |
| oldSlug | Yes | |
| warnings | No | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| sourcePath | Yes | |
| targetPath | Yes | |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| backlinkUpdates | Yes | |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true/readOnlyHint=false, and the description adds substantial behavior beyond them: atomic multi-file write, two-stage dry-run/confirm safety, backlink rewrite mechanics (frontmatter arrays, inline keys, body links, tail-only refs), overwrite and expected_mtime conflict guards, and post-write maintenance output. Very rich disclosure for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the ⚠ warning and a clear numbered two-stage safety list, so the most important information comes first. It is somewhat long, with detailed backlink enumeration and postWriteMaintenance description that could be trimmed, but nearly every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description still sketches return shape (updates, postWriteMaintenance) and fully covers the destructive-write path, safety gating, and failure modes. Given the complexity of an atomic multi-file graph operation, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds contextual meaning: confirm as a two-stage dry-run toggle, overwrite's default-false throw semantics, and expected_mtime as a conflict guard against external modification tied to get_concept's mtime. This goes beyond the schema's per-parameter text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with precise scope: 'change a slug and update every backlink in one atomic graph-level operation,' and clarifies the UID is preserved. It distinguishes itself from siblings by naming patch_concept, find_backlinks, and merge-style operations. An agent can tell exactly what changes and what does not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use this instead of patch_concept + N find_backlinks + N patch_concept loops,' and defines the dry-run vs confirm:true workflow. It also states throw conditions (missing oldSlug, taken newSlug unless overwrite). When-to-use, alternatives, and failure modes are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_relationADestructive
Atomically replace one exact relation with a new target and/or type, moving or replacing its rationale in the same frontmatter write. Defaults to dry-run; pass confirm:true to write. Supports expected_mtime.
| Name | Required | Description | Default |
|---|---|---|---|
| why | No | ||
| from | Yes | Source slug. | |
| newTo | Yes | Replacement target slug. | |
| oldTo | Yes | Current target slug. | |
| confirm | No | ||
| newType | Yes | ||
| oldType | Yes | ||
| expected_mtime | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| from | Yes | |
| dryRun | Yes | |
| changed | Yes | |
| canConfirm | Yes | True only when repeating the call with confirm:true can perform the previewed change without another explicit safety opt-in. |
| newRelation | Yes | |
| oldRelation | Yes | |
| wouldChange | Yes | True only when the dry-run predicts a disk or Git change. |
| previewReady | Yes | True only when this response is a complete dry-run preview that an agent can review. |
| blockedReasons | Yes | Machine-readable human explanations for every condition currently blocking confirmation. |
| postWriteMaintenance | No | Compact maintenance_plan summary for post-write follow-up. Bucket maps describe the remaining queue after the write. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds key behaviors beyond destructiveHint annotation: dry-run by default, confirm:true required to write, atomic single frontmatter write, and rationale move/replace side effect. Also mentions expected_mtime support for concurrency. All are significant and not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action. No filler; every clause adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with destructive hint and output schema, the description covers the essential call semantics: what is replaced, how to confirm, and concurrency support. Missing prerequisites like existence of old relation, but this is reasonably implied by 'exact relation' and the low-level schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 38% schema description coverage, the description compensates by explaining confirm (dry-run), expected_mtime, and why (rationale). It also clarifies oldTo/oldType as the exact relation and newTo/newType as replacement target/type, though not exhaustively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Atomically replace one exact relation with a new target and/or type'. This clearly distinguishes it from siblings like add_relation/remove_relation by focusing on exact-match replacement and atomic rationale handling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context that this is for replacing an existing relation and requires explicit confirm:true to commit. Does not name alternatives or exclusions, but the atomicity and dry-run default imply when to use it over separate remove/add operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_vaultARead-only
R+ (cycle 46) — validate every doc in the vault, return per-doc + per-code aggregate. Replaces the K-round-trip pattern of list_concepts then per-doc get_concept (whose warnings: [...] is per-file). 8 issue codes — unclosed-frontmatter, parse-zero-keys, malformed-frontmatter-line, malformed-quoted-scalar, missing-kind, empty-kind, unknown-kind, missing-uid, invalid-uid, invalid-merged-uids, non-canonical-merged-uids, missing-expected-field, non-canonical-graph-array, dangling-graph-reference, duplicate-slug, duplicate-uid, definition-missing, boundary-missing, epistemic-exclusion, uncertainty-missing, slug-outside-kind-folder, folder-only-evidence, dependency-unwitnessed, dependency-unjudged, starter-example-node, kind-under-sources. Returns { scanned, problems: [{slug, issues: [{code, severity, message}]}], problemsPagination, summary: { problemFiles, errorFiles, warningFiles, byCode: { code: { severity, count, files } } } }. problems is one page, files with errors first and then by slug: offset (default 0) and limit (default 100, max 500) choose it, a page left at the default limit stops sooner when its text would pass 128 KiB, and problemsPagination.nextOffset resumes it, so follow pages until hasMore is false before calling the vault clean. summary always counts the whole vault; each byCode entry names at most 20 files and says how many more in filesOmitted. Also returns pathDrift: frontmatter path: / elements: source paths that no longer exist on disk (vault→code drift), resolved against repoRoot (default: the active resolved repository root from connection_info). Ontology-slug references are never flagged. Fix via patch_concept or remove the stale entry. Also returns evidenceDrift: one Git walk dates every cited path and every concept document, and each concept is current (cited code unchanged since the document), stale (a cited file changed after the document — read it before trusting the recorded meaning), missing (cited path gone) or unknown (nothing cited, no commit in the window, or only a folder-level path moved — listed under folderOnly, because a folder changes on almost any commit). checked: false names why nothing was dated; it never means nothing moved. side effect 0. Use when an agent needs the whole-vault health view: first-contact before writes, before / after a batch write, or surfacing issues to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Problem files per page. Defaults 100. | |
| offset | No | Zero-based index of the first problem file to return, in the order errors first and then slug. Resume with `problemsPagination.nextOffset`. Defaults 0. | |
| repoRoot | No | Repository root that frontmatter source paths resolve against, for the pathDrift check. Defaults to the active resolved repository root from connection_info. Pass this if the vault lives apart from the code repo. |
Output Schema
| Name | Required | Description |
|---|---|---|
| scanned | Yes | Number of vault markdown files scanned. |
| summary | Yes | |
| problems | Yes | |
| pathDrift | Yes | Vault→code path drift: frontmatter source paths missing on disk, resolved against repoRoot. |
| problemsHint | No | Present when the vault has more than one page: which files this page shows and the call for the next one. |
| evidenceDrift | No | Whether each concept still stands on the code it cites, dated by one Git walk: current / stale / missing / unknown per concept, with the stale and missing rows named (bounded to 50 each). |
| summaryFreshness | Yes | |
| problemsPagination | No | The page `problems` holds: `total` problem files, and `nextOffset` for the next page until `hasMore` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint=false, yet the description adds substantial behavior beyond them: the 128 KiB page truncation, the requirement to follow pages until hasMore is false before calling the vault clean, the meaning of checked:false ('never means nothing moved'), 'side effect 0', and the pathDrift/evidenceDrift semantics. This is rich disclosure well past the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and usage, but bloated: it enumerates roughly 30 issue codes and dumps the full return shape even though an output schema exists, and it misstates the count as '8 issue codes'. That redundant and internally inconsistent bulk dilutes the otherwise efficient opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex whole-vault validator with an output schema and read-only annotations, the description covers purpose, usage, pagination, drift checks, and failure semantics without leaving an agent short of what it needs to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the error-first-then-slug ordering that offset indexes into, resumption via problemsPagination.nextOffset, the limit default (matching schema), and repoRoot defaulting to the active resolved repository root from connection_info. That is helpful semantics beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('validate every doc in the vault') plus the returned granularity ('per-doc + per-code aggregate'). It also distinguishes itself from siblings by naming the pattern it replaces ('list_concepts' then per-doc 'get_concept') and by scoping to the whole vault, so an agent can separate it from validate_wiki and the per-doc getters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use contexts: first-contact before writes, before/after a batch write, or surfacing issues to the user. It frames the alternative it supersedes (the K-round-trip list_concepts/get_concept pattern), but does not explicitly state when NOT to use it versus the sibling validate_wiki, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_wikiARead-only
Judge the pages under wiki/ against the wiki page contract (docs/ONTOLOGY-ATLAS-SPEC.md §11): no kind:, the seven required frontmatter fields, the five sections in order, a citation on every bullet under ## Facts, and a cited path that is both declared in sources: and present in the folder. A wiki page is not an ontology node — it carries no kind: by contract, which is what keeps it out of the graph — so validate_vault says nothing about whether one fits its own shape. This is that answer. Problem codes: kind-present, missing-field:, section-order, uncited-fact, bad-citation, bad-truncation-record, citation-target-missing, describes-needs-approval. The optional sources_truncated: key lists which paths in sources: the run read only part of; it is what lets a reader tell a document written up whole from one written up in part. Returns { pageCount, failingCount, pages: [{path, problems: [{code, message, line?}]}] } — the same shape ontology-atlas wiki-validate --json prints, so a person and an agent read one report. side effect 0. Use it after writing or editing a page, and before claiming a compile finished.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | Vault-relative page paths to judge (`wiki/quarter-plan.md`). Omit to judge every page under `wiki/`, which has no cap because the folder decides how many there are. Max 50 when naming them, the same ceiling `get_concepts.uids` uses: past that, asking for the whole folder is one call instead of a list somebody has to assemble. A path outside `wiki/` is reported as a problem rather than silently skipped. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pages | Yes | |
| pageCount | Yes | Pages judged. |
| failingCount | Yes | Pages with at least one problem. Zero means every page judged fits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the readOnlyHint: it explicitly states 'side effect 0', enumerates problem codes, explains the optional `sources_truncated:` key's semantics, and describes the exact JSON return shape. This goes well beyond what the annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, checks, differentiation, problem codes, truncation semantics, output shape, side effect, and usage timing. It is longer than average because the tool itself is complex, but the structure front-loads the core purpose and organizes supporting detail clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is complete: it covers inputs, defaults, edge cases, output shape, failure codes, side effects, and usage context. The output schema exists, yet the description also summarizes the return shape so an agent understands the report at a glance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though the schema already documents `paths` at 100% coverage, the description adds crucial semantic guidance: omitting the parameter validates every page under `wiki/`, enumerating paths is capped at 50, and paths outside `wiki/` are reported as problems rather than silently skipped. This meaningfully enriches the schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Judge') and a precise resource (`wiki/` pages) against an explicitly cited contract, listing the exact checks performed. It also distinguishes itself from `validate_vault`, making the tool's scope immediately identifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool ('after writing or editing a page, and before claiming a compile finished') and contrasts it with `validate_vault`, clarifying why this validator is needed for a different shape. This gives an agent clear decision criteria for selecting it over the sibling validator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v1.4.0- Changed
analyze_repo_structure1 field changed- changed
Input schema / properties / maxDepth / descriptionPrevious value: -"Non-negative integer folder walk depth (default 2, max 10). Higher → more elements."New value: +"Accepted but ignored: no value changes the analysis. When given, it must be an integer from 0 to 10."
- Changed
compile_ontology5 fields changed- added
Input schema / properties / fullAdded value: +{ + "description": "When true, return every array however large the vault is (the answer without arguments is the bounded summary). Page arguments still slice nodes and edges.", + "type": "boolean" +} - changed
Input schema / properties / nodesLimit / descriptionPrevious value: -"Positive integer max nodes to return. Pair with `nodesOffset` to paginate. Omit for unlimited (backward compat), max 500 when provided."New value: +"Positive integer max nodes to return. Pair with `nodesOffset` to paginate. Max 500; `full: true` without it returns every node." - changed
Input schema / properties / summary / descriptionPrevious value: -"When true, omit `nodes` / `edges` / `aliases` / `ambiguousAliases` / `canonicalizationActions` / `indexes` arrays — return only `graphHash`, `maxMtime`, counts (`nodeCount`/`edgeCount`/`aliasCount`/...), and aggregate `byKind`/`byDomain` as counts. Cheap polling for cache invalidation and graph-size assessment."New value: +"When true, omit `nodes` / `edges` / `aliases` / `ambiguousAliases` / `canonicalizationActions` / `indexes` arrays — return only `graphHash`, `maxMtime`, counts (`nodeCount`/`edgeCount`/`aliasCount`/...), and aggregate `byKind`/`byDomain` as counts. Cheap polling for cache invalidation and graph-size assessment. Wins over every other argument." - added
Output schema / properties / deliveryAdded value: +{ + "additionalProperties": false, + "description": "Present when no argument asked for arrays: this is the bounded summary, and these arguments return the rest.", + "properties": { + "fullArguments": { + "additionalProperties": false, + "properties": { + "full": { + "enum": [ + true + ], + "type": "boolean" + } + }, + "required": [ + "full" + ], + "type": "object" + }, + "pageArguments": { + "additionalProperties": false, + "properties": { + "edgesLimit": { + "minimum": 1, + "type": "integer" + }, + "nodesLimit": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "nodesLimit", + "edgesLimit" + ], + "type": "object" + }, + "reason": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "selection": { + "enum": [ + "summary_default" + ], + "type": "string" + } + }, + "required": [ + "selection", + "reason", + "fullArguments", + "pageArguments" + ], + "type": "object" +} - added
Output schema / properties / skippedNonNodeCountAdded value: +{ + "description": "Summary answers only: `.md` files passed over for having no `kind:`.", + "minimum": 0, + "type": "integer" +}
- Changed
connection_info2 fields changed- changed
Output schema / properties / guide / properties / card / patternPrevious value: -"^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$"New value: +"^(?!\\s)(?![\\s\\S]*\\s$)(?![\\s\\S]*\\u0000)[\\s\\S]+$" - changed
Output schema / properties / guideText / patternPrevious value: -"^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$"New value: +"^(?!\\s)(?![\\s\\S]*\\s$)(?![\\s\\S]*\\u0000)[\\s\\S]+$"
- Changed
delete_concept12 fields changed- added
Output schema / properties / backlinks / items / oneOfAdded value: +[ + { + "properties": { + "isNode": { + "const": true + } + }, + "required": [ + "kind" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "uid" + ] + }, + { + "required": [ + "kind" + ] + } + ] + }, + "properties": { + "isNode": { + "const": false + } + } + } +] - removed
Output schema / properties / backlinks / items / properties / domain / minLengthRemoved value: -1 - removed
Output schema / properties / backlinks / items / properties / domain / patternRemoved value: -"^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$" - added
Output schema / properties / backlinks / items / properties / isNodeAdded value: +{ + "description": "True when the referrer is a graph node (has `kind:`). False for a wiki page or other Markdown that links to the target; such a row carries neither `uid` nor `kind`.", + "type": "boolean" +} - added
Output schema / properties / backlinks / items / properties / uid / descriptionAdded value: +"The referring node's permanent UID. Absent when that node has no valid `uid:` (validate_vault reports it) and on every non-node row." - changed
Output schema / properties / backlinks / items / requiredPrevious value: -[ - "uid", - "slug", - "kind", - "title", - "mtime" -]New value: +[ + "slug", + "isNode", + "title", + "mtime" +] - added
Output schema / properties / backlinksAtDelete / items / oneOfAdded value: +[ + { + "properties": { + "isNode": { + "const": true + } + }, + "required": [ + "kind" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "uid" + ] + }, + { + "required": [ + "kind" + ] + } + ] + }, + "properties": { + "isNode": { + "const": false + } + } + } +] - removed
Output schema / properties / backlinksAtDelete / items / properties / domain / minLengthRemoved value: -1 - removed
Output schema / properties / backlinksAtDelete / items / properties / domain / patternRemoved value: -"^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$" - added
Output schema / properties / backlinksAtDelete / items / properties / isNodeAdded value: +{ + "description": "True when the referrer is a graph node (has `kind:`). False for a wiki page or other Markdown that links to the target; such a row carries neither `uid` nor `kind`.", + "type": "boolean" +} - added
Output schema / properties / backlinksAtDelete / items / properties / uid / descriptionAdded value: +"The referring node's permanent UID. Absent when that node has no valid `uid:` (validate_vault reports it) and on every non-node row." - changed
Output schema / properties / backlinksAtDelete / items / requiredPrevious value: -[ - "uid", - "slug", - "kind", - "title", - "mtime" -]New value: +[ + "slug", + "isNode", + "title", + "mtime" +]
- Changed
find_backlinks5 fields changed- added
Output schema / properties / matches / items / oneOfAdded value: +[ + { + "properties": { + "isNode": { + "const": true + } + }, + "required": [ + "kind" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "uid" + ] + }, + { + "required": [ + "kind" + ] + } + ] + }, + "properties": { + "isNode": { + "const": false + } + } + } +] - added
Output schema / properties / matches / items / properties / ambiguousTailAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / matches / items / properties / isNodeAdded value: +{ + "description": "True when the referrer is a graph node (has `kind:`). False for a wiki page or other Markdown that links to the target; such a row carries neither `uid` nor `kind`.", + "type": "boolean" +} - added
Output schema / properties / matches / items / properties / uid / descriptionAdded value: +"The referring node's permanent UID. Absent when that node has no valid `uid:` (validate_vault reports it) and on every non-node row." - changed
Output schema / properties / matches / items / requiredPrevious value: -[ - "uid", - "slug", - "kind", - "title", - "mtime" -]New value: +[ + "slug", + "isNode", + "title", + "mtime" +]
- Changed
find_evidence4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Return only the top-N highest-scoring matches. Omit for all matches (still ranked)."New value: +"Return only the top-N highest-scoring matches. Defaults 50; `total` and `limited` say whether more matched." - added
Output schema / properties / limitHintAdded value: +{ + "description": "Only present when `limited`: how to narrow the search or raise `limit`.", + "type": "string" +} - added
Output schema / properties / limitedAdded value: +{ + "description": "True when `matches` holds fewer rows than `total`.", + "type": "boolean" +} - added
Output schema / properties / totalAdded value: +{ + "description": "Every document that matched, before `limit`.", + "minimum": 0, + "type": "integer" +}
- Changed
get_concept1 field changed- changed
Output schema / properties / warnings / items / properties / code / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid", - "definition-missing", - "boundary-missing", - "epistemic-exclusion", - "uncertainty-missing", - "slug-outside-kind-folder", - "folder-only-evidence", - "dependency-unwitnessed", - "starter-example-node" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "dependency-unjudged", + "starter-example-node", + "kind-under-sources" +]
- Changed
get_concepts1 field changed- changed
Output schema / properties / concepts / items / properties / warnings / items / properties / code / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid", - "definition-missing", - "boundary-missing", - "epistemic-exclusion", - "uncertainty-missing", - "slug-outside-kind-folder", - "folder-only-evidence", - "dependency-unwitnessed", - "starter-example-node" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "dependency-unjudged", + "starter-example-node", + "kind-under-sources" +]
- Changed
index_project1 field changed- changed
Input schema / properties / maxDepth / descriptionPrevious value: -"Folder walk depth forwarded to analyze_repo_structure (default 2, max 10)."New value: +"Forwarded to analyze_repo_structure, which ignores it, so no value changes the analysis. When given, it must be an integer from 0 to 10."
- Changed
infer_imports1 field changed- changed
Output schema / properties / unresolved / items / properties / reason / enumPrevious value: -[ - "empty", - "relative-not-found", - "alias-not-found", - "unsupported-static-form" -]New value: +[ + "empty", + "relative-not-found", + "alias-not-found", + "unsupported-static-form", + "file-too-large" +]
- Changed
merge_concepts1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
query_ontology1 field changed- changed
Input schema / properties / searchBudget / descriptionPrevious value: -"all_paths, query_plan(all_paths), and cycles: maximum DFS states to expand before returning partial results. Defaults to 5000. For cycles this is the only bound that fires on an ACYCLIC graph — when truncatedByBudget is true, zero cycles does NOT mean acyclic (check totalCyclesExact)."New value: +"all_paths, query_plan(all_paths), and cycles: maximum DFS states to expand before returning partial results. Defaults to 5000. For cycles, `limit` trims only the listed rows and this budget is the one bound that can cut the count short — when truncatedByBudget is true, totalCycles is a lower bound and zero cycles does NOT mean acyclic (check totalCyclesExact)."
- Changed
reclassify_concept1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
rename_concept1 field changed- added
Output schema / properties / warningsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
validate_vault8 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Problem files per page. Defaults 100.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first problem file to return, in the order errors first and then slug. Resume with `problemsPagination.nextOffset`. Defaults 0.", + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / problems / items / properties / issues / items / properties / code / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid", - "definition-missing", - "boundary-missing", - "epistemic-exclusion", - "uncertainty-missing", - "slug-outside-kind-folder", - "folder-only-evidence", - "dependency-unwitnessed", - "starter-example-node" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "dependency-unjudged", + "starter-example-node", + "kind-under-sources" +] - added
Output schema / properties / problemsHintAdded value: +{ + "description": "Present when the vault has more than one page: which files this page shows and the call for the next one.", + "type": "string" +} - added
Output schema / properties / problemsPaginationAdded value: +{ + "additionalProperties": false, + "description": "The page `problems` holds: `total` problem files, and `nextOffset` for the next page until `hasMore` is false.", + "properties": { + "hasMore": { + "type": "boolean" + }, + "limit": { + "minimum": 0, + "type": "integer" + }, + "nextOffset": { + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "offset": { + "minimum": 0, + "type": "integer" + }, + "returned": { + "minimum": 0, + "type": "integer" + }, + "total": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "offset", + "limit", + "total", + "returned", + "hasMore", + "nextOffset" + ], + "type": "object" +} - added
Output schema / properties / summary / properties / byCode / additionalProperties / properties / files / descriptionAdded value: +"At most 20 of the `count` files with this code, in page order." - added
Output schema / properties / summary / properties / byCode / additionalProperties / properties / filesOmittedAdded value: +{ + "description": "Present when `files` names fewer than `count`: how many more. Page through `problems` for them.", + "minimum": 1, + "type": "integer" +} - changed
Output schema / properties / summary / properties / byCode / propertyNames / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid", - "definition-missing", - "boundary-missing", - "epistemic-exclusion", - "uncertainty-missing", - "slug-outside-kind-folder", - "folder-only-evidence", - "dependency-unwitnessed", - "starter-example-node" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "dependency-unjudged", + "starter-example-node", + "kind-under-sources" +]
18 tool updates
v1.3.0- Changed
absorb_document4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
add_concept4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
add_concepts4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
add_relation4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
add_relations4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
analyze_repo_structure17 fields changed- changed
Input schema / properties / sourceReads / descriptionPrevious value: -"Optional 1–8 exact repository source ranges. The 8 KiB range, 32 KiB aggregate text, and 64 KiB serialized limits apply only to the returned sourceEvidence subpacket, not to the rest of this analysis result. Returned text is bounded untrusted data, not accepted meaning. Repeat every selector with expectedSha256 when proposal or qualification is present."New value: +"Optional 1–8 exact repository source ranges, or whole-file outlines. mode: 'outline' lists a file's declarations with line numbers so the next lines read is exact; for a file longer than about 200 lines, outline it first instead of reading its head. The 8 KiB range, 16 KiB outline, 32 KiB aggregate, and 64 KiB serialized limits apply only to the returned sourceEvidence subpacket, not to the rest of this analysis result. Returned text is bounded untrusted data, not accepted meaning; an outline is a map to the next read and carries no citation. Repeat every selector with expectedSha256 when proposal or qualification is present, and replay line ranges rather than outlines there." - changed
Input schema / properties / sourceReads / items / properties / maxLines / descriptionPrevious value: -"Maximum complete source lines requested, from 1 through 200."New value: +"Maximum complete source lines requested, from 1 through 200. Required for mode 'lines'; rejected for mode 'outline'." - added
Input schema / properties / sourceReads / items / properties / modeAdded value: +{ + "description": "Read shape, default 'lines'. 'lines' returns the exact requested range. 'outline' reads the whole file under the same 256 KiB file cap and returns its declarations with line numbers, no source text, and no range.", + "enum": [ + "lines", + "outline" + ], + "type": "string" +} - changed
Input schema / properties / sourceReads / items / properties / startLine / descriptionPrevious value: -"One-based first source line to return."New value: +"One-based first source line to return. Required for mode 'lines'; rejected for mode 'outline'." - changed
Input schema / properties / sourceReads / items / requiredPrevious value: -[ - "path", - "startLine", - "maxLines" -]New value: +[ + "path" +] - changed
Output schema / properties / sourceEvidence / properties / rows / items / oneOfPrevious value: -[ - { - "properties": { - "status": { - "const": "read" - } - }, - "required": [ - "actualRange", - "text", - "citation", - "fullFileSha256", - "fileBytes", - "fileLines", - "returnedBytes", - "truncated", - "fileComplete" - ] - }, - { - "not": { - "anyOf": [ - { - "required": [ - "text" - ] - }, - { - "required": [ - "citation" - ] - } - ] - }, - "properties": { - "status": { - "enum": [ - "refused", - "omitted" - ] - } - }, - "required": [ - "reason" - ] - } -]New value: +[ + { + "properties": { + "status": { + "const": "read" + } + }, + "required": [ + "actualRange", + "text", + "citation", + "fullFileSha256", + "fileBytes", + "fileLines", + "returnedBytes", + "truncated", + "fileComplete" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "text" + ] + }, + { + "required": [ + "citation" + ] + } + ] + }, + "properties": { + "status": { + "const": "outlined" + } + }, + "required": [ + "mode", + "sha256", + "language", + "declarationCount", + "declarations", + "fileBytes", + "fileLines", + "returnedBytes", + "truncated" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "text" + ] + }, + { + "required": [ + "citation" + ] + } + ] + }, + "properties": { + "status": { + "enum": [ + "refused", + "omitted" + ] + } + }, + "required": [ + "reason" + ] + } +] - added
Output schema / properties / sourceEvidence / properties / rows / items / properties / declarationCountAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / sourceEvidence / properties / rows / items / properties / declarationsAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "function", + "method", + "class", + "type", + "interface", + "struct", + "enum", + "const", + "export", + "section" + ], + "type": "string" + }, + "line": { + "minimum": 1, + "type": "integer" + }, + "name": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "signature": { + "type": "string" + } + }, + "required": [ + "line", + "kind", + "name", + "signature" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / sourceEvidence / properties / rows / items / properties / languageAdded value: +{ + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" +} - added
Output schema / properties / sourceEvidence / properties / rows / items / properties / modeAdded value: +{ + "enum": [ + "outline" + ], + "type": "string" +} - removed
Output schema / properties / sourceEvidence / properties / rows / items / properties / requestedRange / additionalPropertiesRemoved value: -false - added
Output schema / properties / sourceEvidence / properties / rows / items / properties / requestedRange / anyOfAdded value: +[ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "maxLines": { + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "startLine": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "startLine", + "maxLines" + ], + "type": "object" + } +] - removed
Output schema / properties / sourceEvidence / properties / rows / items / properties / requestedRange / propertiesRemoved value: -{ - "maxLines": { - "maximum": 200, - "minimum": 1, - "type": "integer" - }, - "startLine": { - "minimum": 1, - "type": "integer" - } -} - removed
Output schema / properties / sourceEvidence / properties / rows / items / properties / requestedRange / requiredRemoved value: -[ - "startLine", - "maxLines" -] - removed
Output schema / properties / sourceEvidence / properties / rows / items / properties / requestedRange / typeRemoved value: -"object" - added
Output schema / properties / sourceEvidence / properties / rows / items / properties / sha256Added value: +{ + "pattern": "^[a-f0-9]{64}$", + "type": "string" +} - changed
Output schema / properties / sourceEvidence / properties / rows / items / properties / status / enumPrevious value: -[ - "read", - "refused", - "omitted" -]New value: +[ + "read", + "outlined", + "refused", + "omitted" +]
- Changed
connection_info4 fields changed- added
Input schema / properties / guideAdded value: +{ + "description": "Return the long-form rules for one topic in `guideText`: `meta_model` (the five authorable kinds and the is_a boundary), `construction` (the rules to read before add_concept), `lifecycle` (review before write), `write_safety` (the dry-run/confirm and expected_mtime patterns), `workflows` (the three starting workflows), or `competency` (the exact `## Competency answers` section `finalize_project_meaning` parses).", + "enum": [ + "meta_model", + "construction", + "lifecycle", + "write_safety", + "workflows", + "competency" + ], + "type": "string" +} - added
Output schema / properties / guideAdded value: +{ + "additionalProperties": false, + "properties": { + "card": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "topics": { + "items": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "card", + "topics" + ], + "type": "object" +} - added
Output schema / properties / guideTextAdded value: +{ + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "vaultRoot", - "repoRoot", - "vaultResolution", - "repoResolution", - "sameRoot", - "restartRequiredForRootChange", - "server" -]New value: +[ + "vaultRoot", + "repoRoot", + "vaultResolution", + "repoResolution", + "sameRoot", + "restartRequiredForRootChange", + "server", + "guide" +]
- Changed
delete_concept4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
get_concept1 field changed- changed
Output schema / properties / warnings / items / properties / code / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "starter-example-node" +]
- Changed
get_concepts1 field changed- changed
Output schema / properties / concepts / items / properties / warnings / items / properties / code / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "starter-example-node" +]
- Changed
merge_concepts4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
patch_concept4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
query_ontology2 fields changed- changed
Input schema / properties / kinds / items / enumPrevious 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" +] - changed
Input schema / properties / kinds / maxItemsPrevious value: -13New value: +20
- Changed
reclassify_concept4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
remove_relation4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
rename_concept4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
replace_relation4 fields changed- changed
Output schema / properties / postWriteMaintenance / properties / actions / items / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / filters / properties / kinds / items / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / properties / kind / enumPrevious 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" +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / properties / kind / enumPrevious 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" +]
- Changed
validate_vault3 fields changed- added
Output schema / properties / evidenceDriftAdded value: +{ + "additionalProperties": false, + "description": "Whether each concept still stands on the code it cites, dated by one Git walk: current / stale / missing / unknown per concept, with the stale and missing rows named (bounded to 50 each).", + "properties": { + "checked": { + "type": "boolean" + }, + "counts": { + "additionalProperties": false, + "properties": { + "current": { + "minimum": 0, + "type": "integer" + }, + "folderOnly": { + "description": "Unknown rows whose only moved evidence is a folder path.", + "minimum": 0, + "type": "integer" + }, + "missing": { + "minimum": 0, + "type": "integer" + }, + "stale": { + "minimum": 0, + "type": "integer" + }, + "unknown": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "current", + "stale", + "missing", + "unknown", + "folderOnly" + ], + "type": "object" + }, + "folderOnly": { + "description": "Concepts whose only evidence that moved is a folder: something under it changed, which is not yet a verdict on the meaning.", + "items": { + "additionalProperties": false, + "properties": { + "docChangedAt": { + "type": [ + "string", + "null" + ] + }, + "folders": { + "items": { + "additionalProperties": false, + "properties": { + "changedAt": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "changedAt" + ], + "type": "object" + }, + "type": "array" + }, + "kind": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "slug", + "kind", + "docChangedAt", + "folders" + ], + "type": "object" + }, + "type": "array" + }, + "hint": { + "type": "string" + }, + "missing": { + "items": { + "additionalProperties": false, + "properties": { + "gone": { + "items": { + "type": "string" + }, + "type": "array" + }, + "kind": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "slug", + "kind", + "gone" + ], + "type": "object" + }, + "type": "array" + }, + "reason": { + "description": "Why nothing was dated, when `checked` is false.", + "type": "string" + }, + "repoRoot": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "stale": { + "items": { + "additionalProperties": false, + "properties": { + "docChangedAt": { + "type": [ + "string", + "null" + ] + }, + "kind": { + "type": "string" + }, + "moved": { + "items": { + "additionalProperties": false, + "properties": { + "changedAt": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "changedAt" + ], + "type": "object" + }, + "type": "array" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "slug", + "kind", + "docChangedAt", + "moved" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "checked", + "counts", + "stale", + "missing", + "folderOnly", + "hint" + ], + "type": "object" +} - changed
Output schema / properties / problems / items / properties / issues / items / properties / code / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "starter-example-node" +] - changed
Output schema / properties / summary / properties / byCode / propertyNames / enumPrevious value: -[ - "unclosed-frontmatter", - "parse-zero-keys", - "malformed-frontmatter-line", - "malformed-quoted-scalar", - "missing-kind", - "empty-kind", - "unknown-kind", - "missing-uid", - "invalid-uid", - "invalid-merged-uids", - "non-canonical-merged-uids", - "missing-expected-field", - "non-canonical-graph-array", - "dangling-graph-reference", - "duplicate-slug", - "duplicate-uid" -]New value: +[ + "unclosed-frontmatter", + "parse-zero-keys", + "malformed-frontmatter-line", + "malformed-quoted-scalar", + "missing-kind", + "empty-kind", + "unknown-kind", + "missing-uid", + "invalid-uid", + "invalid-merged-uids", + "non-canonical-merged-uids", + "missing-expected-field", + "non-canonical-graph-array", + "dangling-graph-reference", + "duplicate-slug", + "duplicate-uid", + "definition-missing", + "boundary-missing", + "epistemic-exclusion", + "uncertainty-missing", + "slug-outside-kind-folder", + "folder-only-evidence", + "dependency-unwitnessed", + "starter-example-node" +]
20 tool updates
v1.2.5- Changed
absorb_document8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
add_concept8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
add_concepts8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
add_relation8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
add_relations8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
analyze_repo_structure5 fields changed- added
Input schema / properties / qualification / properties / purposeAuthority / properties / decisions / minItemsAdded value: +1 - added
Input schema / properties / qualification / properties / purposeAuthority / properties / nonGoals / minItemsAdded value: +1 - added
Input schema / properties / qualification / properties / purposeAuthority / properties / sourceRefs / minItemsAdded value: +1 - added
Input schema / properties / sourceReadsAdded value: +{ + "description": "Optional 1–8 exact repository source ranges. The 8 KiB range, 32 KiB aggregate text, and 64 KiB serialized limits apply only to the returned sourceEvidence subpacket, not to the rest of this analysis result. Returned text is bounded untrusted data, not accepted meaning. Repeat every selector with expectedSha256 when proposal or qualification is present.", + "items": { + "additionalProperties": false, + "properties": { + "expectedSha256": { + "description": "Optional 64-character lowercase SHA-256 of the complete file. Required on every selector when proposal or qualification is present.", + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "maxLines": { + "description": "Maximum complete source lines requested, from 1 through 200.", + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "path": { + "description": "Literal repository-relative source path, at most 1,024 Unicode characters; no glob or directory traversal.", + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "startLine": { + "description": "One-based first source line to return.", + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "path", + "startLine", + "maxLines" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" +} - added
Output schema / properties / sourceEvidenceAdded value: +{ + "additionalProperties": false, + "description": "Bounded sourceEvidence:v1 subpacket. Its byte and row ceilings cover this subpacket only; they do not describe or truncate the complete analyze_repo_structure response.", + "properties": { + "contract": { + "enum": [ + "sourceEvidence:v1" + ], + "type": "string" + }, + "coverage": { + "enum": [ + "requested-ranges-only" + ], + "type": "string" + }, + "limits": { + "additionalProperties": { + "minimum": 1, + "type": "integer" + }, + "type": "object" + }, + "repositoryComplete": { + "enum": [ + false + ], + "type": "boolean" + }, + "rows": { + "items": { + "additionalProperties": false, + "oneOf": [ + { + "properties": { + "status": { + "const": "read" + } + }, + "required": [ + "actualRange", + "text", + "citation", + "fullFileSha256", + "fileBytes", + "fileLines", + "returnedBytes", + "truncated", + "fileComplete" + ] + }, + { + "not": { + "anyOf": [ + { + "required": [ + "text" + ] + }, + { + "required": [ + "citation" + ] + } + ] + }, + "properties": { + "status": { + "enum": [ + "refused", + "omitted" + ] + } + }, + "required": [ + "reason" + ] + } + ], + "properties": { + "actualRange": { + "additionalProperties": false, + "properties": { + "endLine": { + "minimum": 1, + "type": "integer" + }, + "startLine": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "startLine", + "endLine" + ], + "type": "object" + }, + "citation": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "fileBytes": { + "minimum": 0, + "type": "integer" + }, + "fileComplete": { + "type": "boolean" + }, + "fileLines": { + "minimum": 0, + "type": "integer" + }, + "fullFileSha256": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "next": { + "anyOf": [ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "expectedSha256": { + "pattern": "^[a-f0-9]{64}$", + "type": "string" + }, + "maxLines": { + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "path": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "startLine": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "path", + "startLine", + "maxLines", + "expectedSha256" + ], + "type": "object" + } + ] + }, + "path": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "reason": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "requestComplete": { + "type": "boolean" + }, + "requestedRange": { + "additionalProperties": false, + "properties": { + "maxLines": { + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + "startLine": { + "minimum": 1, + "type": "integer" + } + }, + "required": [ + "startLine", + "maxLines" + ], + "type": "object" + }, + "returnedBytes": { + "minimum": 0, + "type": "integer" + }, + "status": { + "enum": [ + "read", + "refused", + "omitted" + ], + "type": "string" + }, + "text": { + "type": "string" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "status", + "path", + "requestedRange", + "requestComplete", + "next" + ], + "type": "object" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + }, + "serializedBytes": { + "maximum": 65536, + "minimum": 0, + "type": "integer" + }, + "totalReturnedBytes": { + "maximum": 32768, + "minimum": 0, + "type": "integer" + }, + "trust": { + "enum": [ + "untrusted-source-data" + ], + "type": "string" + } + }, + "required": [ + "contract", + "trust", + "limits", + "coverage", + "repositoryComplete", + "rows", + "totalReturnedBytes", + "serializedBytes" + ], + "type": "object" +}
- Changed
compile_ontology3 fields changed- added
Output schema / properties / edges / items / properties / rationaleAdded value: +{ + "description": "One-line rationale stored with this relation in the source document's `relation_notes` map (written by `add_relation(why)`). Omitted when no note is stored for the target.", + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" +} - added
Output schema / properties / referencedOnlyCountAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "version", - "graphHash", - "maxMtime", - "nodeCount", - "edgeCount", - "resolvedEdgeCount", - "externalEdgeCount", - "unresolvedEdgeCount", - "aliasCount", - "ambiguousAliasCount", - "issueCount", - "canonicalizationActionCount", - "byKind", - "byDomain" -]New value: +[ + "version", + "graphHash", + "maxMtime", + "nodeCount", + "edgeCount", + "resolvedEdgeCount", + "externalEdgeCount", + "unresolvedEdgeCount", + "referencedOnlyCount", + "aliasCount", + "ambiguousAliasCount", + "issueCount", + "canonicalizationActionCount", + "byKind", + "byDomain" +]
- Changed
delete_concept8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
get_concept3 fields changed- added
Output schema / properties / isNodeAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / reviewAdded value: +{ + "additionalProperties": false, + "properties": { + "agentGuidance": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "currentness": { + "enum": [ + "not-confirmed", + "unknown", + "current", + "changed-since-review" + ], + "type": "string" + }, + "note": {}, + "reviewedAt": {}, + "reviewedBy": {}, + "state": {} + }, + "required": [ + "state", + "currentness" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "uid", - "slug", - "frontmatter", - "bodyInfo", - "neighbors", - "outgoingEdges", - "mtime" -]New value: +[ + "uid", + "slug", + "isNode", + "frontmatter", + "bodyInfo", + "neighbors", + "outgoingEdges", + "review", + "mtime" +]
- Changed
get_concepts2 fields changed- added
Output schema / properties / concepts / items / properties / isNodeAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / concepts / items / properties / reviewAdded value: +{ + "additionalProperties": false, + "properties": { + "agentGuidance": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "currentness": { + "enum": [ + "not-confirmed", + "unknown", + "current", + "changed-since-review" + ], + "type": "string" + }, + "note": {}, + "reviewedAt": {}, + "reviewedBy": {}, + "state": {} + }, + "required": [ + "state", + "currentness" + ], + "type": "object" +}
- Added
get_constellation - Added
list_constellations - Changed
list_kinds3 fields changed- added
Output schema / properties / conceptsIncludingReferencedAdded value: +{ + "description": "Documented nodes plus referenced-only slugs, matching the graph-visible concept census.", + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / referencedOnlyTotalAdded value: +{ + "description": "Number of slugs referenced by graph relations without a corresponding node document.", + "minimum": 0, + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "total", - "byKind" -]New value: +[ + "total", + "byKind", + "referencedOnlyTotal", + "conceptsIncludingReferenced" +]
- Changed
merge_concepts8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
patch_concept8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
reclassify_concept8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
remove_relation8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
rename_concept8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
replace_relation8 fields changed- added
Output schema / properties / postWriteMaintenance / properties / actions / items / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / actions / items / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextExecutableAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / allOfAdded 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" + ] + } + } +] - changed
Output schema / properties / postWriteMaintenance / properties / nextReviewAction / requiredPrevious value: -[ - "id", - "phase", - "kind", - "severity", - "score", - "executable", - "reason", - "proposedAction" -]New value: +[ + "id", + "phase", + "kind", + "severity", + "score", + "executable", + "reason" +] - added
Output schema / properties / postWriteMaintenance / properties / summary / properties / capabilitiesWithoutEvidenceAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / postWriteMaintenance / properties / summary / requiredPrevious 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" +]
- Changed
validate_vault2 fields changed- added
Output schema / properties / summaryFreshnessAdded value: +{ + "additionalProperties": false, + "properties": { + "checked": { + "type": "boolean" + }, + "hint": { + "type": "string" + }, + "stale": { + "items": { + "additionalProperties": false, + "properties": { + "behindByMs": { + "minimum": 0, + "type": "number" + }, + "bodyChangedAt": { + "format": "date-time", + "type": "string" + }, + "childCount": { + "minimum": 0, + "type": "integer" + }, + "hint": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + }, + "kind": { + "enum": [ + "project", + "domain" + ], + "type": "string" + }, + "membershipChangedAt": { + "format": "date-time", + "type": "string" + }, + "reasonCode": { + "type": "string" + }, + "score": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "slug": { + "minLength": 1, + "pattern": "^(?!\\s)(?!.*\\s$)(?!.*\\u0000).+$", + "type": "string" + } + }, + "required": [ + "slug", + "kind", + "childCount", + "score", + "hint" + ], + "type": "object" + }, + "type": "array" + }, + "summaryNodes": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "checked", + "summaryNodes", + "stale", + "hint" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "scanned", - "problems", - "summary", - "pathDrift" -]New value: +[ + "scanned", + "problems", + "summary", + "summaryFreshness", + "pathDrift" +]
38 tool updates
v0.13.0- First observed
absorb_document - First observed
add_concept - First observed
add_concepts - First observed
add_relation - First observed
add_relations - First observed
analyze_repo_structure - First observed
compile_ontology - First observed
connect_project_source - First observed
connection_info - First observed
delete_concept - First observed
disconnect_project_source - First observed
finalize_project_meaning - First observed
find_backlinks - First observed
find_evidence - First observed
find_neighbors - First observed
find_orphans - First observed
find_path - First observed
get_concept - First observed
get_concepts - First observed
git_history - First observed
git_snapshot - First observed
git_status - First observed
index_project - First observed
infer_imports - First observed
inspect_architecture - First observed
list_concepts - First observed
list_kinds - First observed
merge_concepts - First observed
patch_concept - First observed
query_concepts - First observed
query_ontology - First observed
read_source - First observed
reclassify_concept - First observed
remove_relation - First observed
rename_concept - First observed
replace_relation - First observed
validate_vault - First observed
validate_wiki
TDQS
Scored across 40 tools
Many tools have distinct purposes (validate_wiki vs validate_vault, add_concept vs add_concepts), but the graph-query surface is genuinely overlapping: query_concepts, query_ontology.match_nodes, query_ontology.facets, list_concepts, and find_neighbors all filter/walk nodes, and compile_ontology vs query_ontology have a blurry compile-vs-read boundary. The very long descriptions try hard to carve boundaries, which helps, but an agent could still misselect among the traversal/query tools.
The vast majority follow a clean verb_noun snake_case pattern (get_concept, add_relations, find_path, validate_vault, patch_concept), with consistent singular/plural batch pairs. A few outliers break the verb-first pattern (git_snapshot, git_status, git_history, connection_info), which are minor deviations rather than chaos.
40 tools is well above the 25+ 'too many' threshold for the rubric. The batch variants and code-analysis tools each earn some place, but a monolithic query_ontology with ~35 embedded operations plus overlapping standalone query tools indicates the surface is over-expanded rather than tightly scoped.
Lifecycle coverage is unusually thorough: concept CRUD plus rename/reclassify/merge/delete, relation add/remove/replace, batch variants, git state, validation, compile, code analysis, project binding, and source reading. Minor gaps remain (e.g., no bulk-delete/bulk-move for concepts), but there are few obvious dead ends.
Maintenance
Related MCP Connectors
A living knowledge graph to read, think against, and leave a deposit in that outlives you.
Personal context for every AI: search, read, and write back to your private Markdown library.
Deterministic context layer for your codebase: change impact, blast radius, answers with receipts.
Self-hostable shared brain for you and your AI agents — docs, flows, meetings, decisions, rationale
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceTransforms a folder of Markdown files into a structured, version-controlled knowledge base with semantic search and safe AI editing via draft branches.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to read and write a local-first knowledge base of plain markdown files in git, with governance gates for safe, hash-anchored edits.1Apache 2.0
- AlicenseAqualityAmaintenanceSelf-hostable, markdown-native team wiki with a built-in MCP server: agents search, read, and write your wiki pages (ranked Postgres full-text + semantic search, backlink traversal). Plus Atlas, which auto-generates a cited, coverage-checked wiki from your git repos and Jira.4170AGPL 3.0
- FlicenseBqualityBmaintenanceTurns local code repositories into a queryable dependency graph built from AST parsing and git co-edit history, then exposes it alongside an Obsidian vault as persistent memory. Enables context retrieval, impact analysis of proposed changes, and curation of durable prose knowledge through full-text search and Personalized PageRank classification—all fully offline without API keys or embeddings.30-