graph-workflow — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited graph-workflow (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
When the user asks you to do real work — coding, analysis, writing, problem-solving — the graph is how you think, not something you do afterward. Before writing a single line of code or prose:
graph_semantic_search for prior thinking on this topic. Don't start from zero.Strategy#47a4 problem with Feedback#9b5c loops. Name them.decision for approach chosen, tension for tradeoffs, question for unknowns. Do this BEFORE or ALONGSIDE writing code, not after.doc_create nodes inside the graph, connected to the concepts that motivated them.The pattern: think → commit understanding → build → commit artifacts → connect them.
Wrong: user asks for code → you write a file → done. The graph was irrelevant. Right: user asks for code → you search graph/sema → commit design decisions → write code as doc tree → connect code to decisions → the graph records WHY, not just WHAT.
This applies to everything, not just coding: research, analysis, creative writing, problem-solving. If the work is substantial enough to take more than one turn, it belongs in the graph.
Every thinking node should capture a moment in the gradual understanding process — not the conclusion, but the shift in belief that led there.
Ask yourself: what changed in my understanding just now? What did I believe before, and what do I believe after?
A thinking node that says "this chapter discusses governance" is useless. A thinking node that says "I thought governance meant rules, but here it means pattern-weaving" — with edges to the prior belief it supersedes and the surprise that caused the shift — is a reasoning trace that teaches future agents how to think.
graph_add_concept: { title, trigger, understanding, why }
graph_connect: { from, to, type, why }
graph_revise: { node, understanding, before, after, pivot, why }
doc_create: { title, content, fileType, isDocRoot, parentId, level }NEVER use: name (→ title), body (→ understanding), source (→ from), target (→ to), edgeType (→ type)
graph_batch({
operations: [
{ tool: "graph_add_concept", params: {
title: "Example Concept",
trigger: "foundation",
understanding: "What this means",
why: "Why this matters"
}},
{ tool: "graph_connect", params: {
from: "$0.id",
to: "n_existing_node",
type: "refines",
why: "Why these connect"
}}
],
commit_message: "what shifted in your understanding"
})graph_revise with before/after/pivot captures the shift. The why is your commit message.solver_delegate.Every batch needs a commit_message. Batches are atomic. No orphans — every new concept must connect to at least one existing node in the same batch.
// CORRECT
graph_batch({
operations: [
{ tool: "graph_add_concept", params: { ... } },
{ tool: "graph_connect", params: { ... } }
],
commit_message: "Your reflection on what you're adding and why"
})
// WRONG — fails
graph_add_concept({ ... })`graph_add_concept` — ALL four required:
| Parameter | What |
|---|---|
title | Title of the concept (not ~~name~~, not ~~text~~) |
trigger | One of the valid trigger enums |
understanding | Your synthesis of this concept |
why | Why this matters (min 3 chars) |
`graph_connect` — ALL four required:
| Parameter | What |
|---|---|
from | Source node ID or variable reference ($0.id) |
to | Target node ID |
type | One of the valid edge type enums (not ~~edgeType~~) |
why | Why this connection exists (min 3 chars) |
`graph_revise` — updating understanding:
| Parameter | What |
|---|---|
node | Target node ID (not ~~nodeId~~) |
understanding | New understanding (not ~~content~~) |
before | What you believed before |
after | What you believe now |
pivot | What caused the shift |
why | Why this revision matters |
Within a graph_batch, reference the result of earlier operations using $N.id (0-indexed):
graph_batch({
operations: [
{ tool: "graph_add_concept", params: { title: "Insight A", trigger: "surprise", understanding: "...", why: "..." }},
{ tool: "graph_add_concept", params: { title: "Insight B", trigger: "tension", understanding: "...", why: "..." }},
{ tool: "graph_connect", params: { from: "$0.id", to: "$1.id", type: "contradicts", why: "A and B are mutually exclusive" }}
],
commit_message: "these two insights pull in opposite directions"
})| Tool | Parameter | Correct | WRONG |
|---|---|---|---|
graph_add_concept | Title | title | ~~name~~, ~~text~~ |
doc_create | Title | title | ~~text~~, ~~name~~ |
doc_create | Hierarchy | level | ~~docType~~, ~~type~~ |
doc_create | Content | content | ~~prose~~, ~~body~~ |
doc_revise | Target | nodeId | ~~node~~, ~~id~~ |
doc_revise | Content | content | ~~prose~~ |
doc_revise | Reason | why | (required!) |
graph_revise | Target | node | ~~nodeId~~ |
graph_revise | Content | understanding | ~~content~~ |
graph_connect | Edge type | type | ~~edgeType~~ |
Every graph_connect must include an explicit type. relates is the fallback — reach for specific types first:
| Type | Use |
|---|---|
supersedes | Newer understanding replaces older |
contradicts | Opposing ideas — one must yield |
diverse_from | Different perspective — both valid |
refines | Adds precision to existing concept |
implements | Abstract → Concrete realization |
abstracts_from | Concrete → Generalization |
contextualizes | Provides framing for another concept |
questions | Raises doubt about |
answers | Resolves a question |
expresses | Document → Concept it discusses |
| Type | Use |
|---|---|
learned_from | Cognitive lineage: "I understood X by studying Y" |
| Type | Use |
|---|---|
validates | Later evidence confirms a prediction |
invalidates | Later evidence refutes a prediction |
| Type | Use |
|---|---|
contains | Parent → Child hierarchy |
next | Sequential ordering |
relates | General relationship (default fallback) |
If you can't explain WHY two nodes connect in one sentence, don't connect them.
Don't collapse to foundation and decision. The full palette:
| Trigger | When to use | The cognitive act |
|---|---|---|
foundation | Core concepts, axioms, starting points | Establishing bedrock |
surprise | Unexpected findings, contradictions | Reality check |
tension | Conflicts, trade-offs, unresolved issues | Holding opposing ideas |
consequence | Implications, downstream effects | Foreseeing what follows |
repetition | Patterns that recur across contexts | Identifying structural laws |
question | Open questions, unknowns to explore | Defining the boundary |
decision | Choice points, alternatives considered | Collapsing possibility |
experiment | Empirical tests, validation attempts | Testing belief against reality |
analysis | Agent-generated structured examination | Structured examination |
serendipity | Chaos-injected insights | Unexpected connection |
thinking | RESERVED — synthesizer agent only. Use analysis or surprise instead | — |
reference | Pointer to another project or URL | Citation |
library | Collection of references | Curated collection |
prediction | Forward-looking belief | Forecasting |
evaluation | Normative reflection | Value judgment |
hypothesis | Explanatory theory | Provisional explanation |
model | Generalized pattern | Abstraction |
Don't just "log" events. Metabolize raw inputs into structured understanding:
| When you feel… | Create | The cognitive act |
|---|---|---|
| "This conflicts with X" | tension | Synthesis — holding two opposing ideas |
| "Wait, that's weird…" | surprise | Update — reality check against mental model |
| "So therefore…" | consequence | Projection — foreseeing downstream effects |
| "I don't get X…" | question | Curiosity — defining the boundary of understanding |
| "We've been here before" | repetition | Pattern recognition — identifying structural laws |
| "I choose X because…" | decision | Agency — collapsing possibility into commitment |
Commit messages are visible to other agents via graph_updates. They see not just WHAT you created but WHY.
Descriptive (BAD):
Reflective (GOOD):
For real tasks: project_create + project_switch into a fresh project. Do all work there. When done, switch to default and plant one reference node pointing at the task project.
default is your long-term autobiography. Task projects hold reasoning for specific work.
When using doc_generate, the file name is derived from the document root's title:
my-paper-title.mdfileTypeanalysis-report.mdrelates is the fallback. Before using it, run through this decision tree:
refinescontradictsvalidatesinvalidatessupersedesimplementsabstracts_fromlearned_fromexpressesquestions; resolves doubt → answersIf none of these fit, relates is fine — but most edges have a more specific type.
Watch for these patterns that indicate shallow graph work:
graph_batch({
operations: [
{ tool: "doc_create", params: {
title: "Paper Title", level: "document",
content: "# Introduction...", isDocRoot: true, fileType: "md"
}},
{ tool: "doc_create", params: {
title: "Methods", level: "section",
content: "## Methods...", parentId: "$0.id"
}},
{ tool: "doc_create", params: {
title: "Results", level: "section",
content: "## Results...", parentId: "$0.id", afterId: "$1.id"
}}
],
commit_message: "scaffolding paper structure"
})| Goal | Tool |
|---|---|
| List all document roots | doc_list_roots() |
| See structure (no content) | doc_get_tree({ rootId, brief: true }) |
| Context and location | doc_navigate({ nodeId }) |
| Read content | doc_read({ nodeId }) |
| Regenerate to file | doc_generate({ rootId }) |
Don't load entire documents. Navigate like a researcher:
doc_list_roots() — What documents exist?doc_get_tree({ rootId, brief: true }) — See structuredoc_read({ nodeId }) — Read selectively~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.