Folio Assistant Core

Reading a knowledge graph before you have anything

This skill assumes a text editor and nothing else. No MCP server, no skill-fetching tool, no work-plan store, no build. If those exist they are not yours to rely on yet — see AGENTS.md.

That constraint is the reason this skill exists rather than a pointer to the harness's own navigation tooling: an agent here may have no connected server, and a bootstrap that required one would fail in exactly the cold-start case it exists for.

A graph is files that declare what they are

Three facts carry the whole model, and every one of them is checkable by reading:

  1. An instance declares the directories it scans, in its declaration at its root. Each entry is an id, a path, and the kinds of graph found there.
  2. A directory is a place to look, not a type. One may hold more than one part of a graph, so the directory does not say what its files are — the files do, in their own front matter or $schema.
  3. Ids are stable across a relocation; paths are not. An override matches on an entry's id, never its path. Matching on path turns one relocated graph into two, and every consumer then scans a directory that is not there.

Two more words you will meet in a declaration. A field this skill does not describe is an Extension: a Harness added it, and you ignore it. A Harness's own kind of declaration, which requires everything bootstrap's does and adds Extensions, is a Subkind of bootstrap's: read it as bootstrap's, and it still means what it says.

Versions and addresses. A declaration may state its version (MAJOR.MINOR.PATCH) and an iriBase. Every identifier it mints is then <iriBase><version>/…, which pins exactly, and a page meant for a person is <iriBase>v<major>/…. Bootstrap's own are in its declaration; read them there rather than trusting a copy.

Do this, in order

  1. Read the repository's declaration. If there is none, this repository is not an instance yet, and that is the case bootstrap exists for.
  2. Find the entry whose graphTypologies name the kind you want. In bootstrap they are named for what they hold: skills, processes, scenarios (the Roles) and schemas. The entry's path is relative to the declaration.
  3. Read the files in that directory. A markdown file declaring name: and description: in front matter is a skill — its body is the instruction you were looking for. A file declaring $schema: is stating that it is something else, and is not a skill however it is named.
  4. Follow a reference by id, not by path. A node that names another names it by id; resolve it through the declaration rather than guessing a filename.

What "I could not determine" means here

An absent declaration and an unreadable one are different, and collapsing them is the mistake this section exists to prevent:

what you foundwhat it meanswhat to do
no declarationnot an instance yetthis is bootstrap's case — continue
a declaration that will not parsean instance asserting something brokenstop and say so; do not fall back
a declared directory that is not therethe declaration is wrongstop and say so — scanning nothing and reporting a clean run is the defect
no declaration for a kind you wantthis instance has none of itthat is an answer, not a failure

A declared-but-absent directory is the one to be loudest about. Every consumer that scans it finds nothing and reports success, so the failure is silent and looks exactly like a clean result.

What this skill is NOT

It does not describe what a Harness above bootstrap holds, such as its content or its checks. Those are concepts of the Harness you have not loaded yet, and a description of them here would be a second one, free to disagree with the first.

If you find yourself needing one of them to finish bootstrap, that is a sign the boundary is in the wrong place — say so rather than importing the definition.