Use the AgenticSystemCore engine (command agsc) to turn a folder of Markdown into a knowledge node and to work in one as an agent ā initialise, lint, build, verify, read, cite, propose, compose,...
A Bundle is a folder holding agsc.config.json and content/ with one Markdown file per item. The engine builds it into a knowledge node: a static site, a typed graph, a search index, llms.txt, chunks.jsonl, skill packs, boards and a discovery document, with the same bytes from any conforming implementation. People and agents read a node through web addresses and change it only by proposals a person merges. Specification 1.0.0; where this skill and a rule disagree, the rule wins (https://agenticsystemcore.com/specs/).
agsc propose prints lines beginning run:; those are the person's commands, not yours.www/. It is a local build; publishing it is the person's act.npx -y agsc-cli <verb> otherwise.prov.operator, a security contact, site.base or a licence choice. Ask the person.One Bundle, six ways of using it; no mode adds a type or a key. A worked Bundle per mode is in the engine's examples/demos/mode-<n>-*/, with commands in its docs/DEMOS.md.
| Mode | You want | Do | Configuration |
|---|---|---|---|
| 0 auto-wiki | a site, graph and llms.txt from notes |
agsc init, then section 5, then agsc build |
none |
| 1 memory for agents | read, cite and propose, on one node or many | section 6; agsc mcp; agsc propose <slug> |
peers[] to name other nodes |
| 2 living specifications | decisions, specs, tasks and gates in one checked memory | concepts of kind: decision, spec, task; gate items; agsc ci; agsc export --steer |
none |
| 3 skills | procedures installed in an agent's skills folder | agsc skills, agsc skills install |
none |
| 4 runnable knowledge | a selection of concepts as a starting architecture | agsc compose <slug>⦠|
run{} to list a procedure's steps under an allow list |
| 5 live board | people and agents working tasks until done | task concepts in a cluster; claim by proposal (section 5) | agents[], channels[], budget{}, contribute[] |
The configuration keys are in references/configuration.md.
node --version # 22.13 or later
npx -y agsc-cli --version # agsc 1.0.1; when the person wants it installed: npm install -g agentic-system-core
cd <bundle> # every verb runs in the folder that holds agsc.config.json
From a folder of notes, agsc init moves every Markdown file except README.md to content/concepts/ as kind: explainer (type, title, a provenance block, an aliases: entry with the old path), and writes agsc.config.json, the root document content/index.md, .gitignore and .env.example. Then ask the person for three things and write them:
https:// address: set site.base in agsc.config.json and base: in content/index.md to the same value (a mismatch is AGSC-E204)..well-known/security.txt as one Contact: line (a mailto: or https:// address). Write no Expires: line: the build adds one, the build instant plus 364 days, so the file never goes stale:Contact: mailto:security@example.org
site.tdm_crawlers (or keep the list init wrote if the person agrees).git init -q && git add -A && git commit -q -m 'notes'), or SOURCE_DATE_EPOCH set in the environment. Without one the build instant is 1970-01-01 and ci reports AGSC-E204 on the security contact's expiry.Then agsc ci. Until the security file exists, lint, build and ci report AGSC-E901.
| Job | Command | What it does |
|---|---|---|
| start | agsc init |
adopts notes as in section 3 |
| check | agsc lint [--fix] |
schema, links, tags, provenance, secrets; --fix normalises key order and bytes |
| build | agsc build [--level <n>] |
writes www/: pages, graph.jsonld/.nq/.ttl, search.json, llms.txt, llms-full.txt, now.md, chunks.jsonl, skills/, /.well-known/knowledge-linkset; boards/ when a cluster holds a task; ledger.jsonl inside a git repository |
| prove | agsc verify [--ledger] |
builds twice and compares the bytes; --ledger re-derives the chain from git log and compares it with the published one |
| pipeline | agsc ci [--level <n>] |
lint, two builds, verify; verdict in dist/gate.json; forge files under dist/forge/ for gates with enforce:; leaves no www/ |
| change | agsc propose <slug> |
diffs the item against its last commit; writes dist/proposal/<n>.patch and <n>.md (the pull-request body); prints the person's git commands |
| review | agsc review |
the lint-only review lane |
| lane | agsc refresh --agent <name> --dry-run [--task <t>] |
a dry run of a declared, enabled agent lane: writes its proposal with the run's Episode, calls no model; without --dry-run it refuses (AGSC-E001) because no model adapter ships |
| export | agsc export --markdown|--okf|--jsonld|--jsonl|--steer [--target <a,b>]|--to <adapter> [--zip] |
adapters llm-context, cogx, gabbe, skills, board, mermaid; per-adapter flags in agsc export --help |
| import | agsc import <dir> --from <adapter> [--dry-run] [--replace] |
adapters okf, cogx, gabbe, skills, board, old-site; writes nothing over an existing item unless --replace |
| assemble | agsc compose <slug>⦠[--out <dir>] [--zip], agsc compose --from <slug> |
a Harness under dist/harness/<selection-hash>/: AGENTS.md, arc42.md, workspace.dsl, diagram.mmd, harness.jsonld, decisions/, skills/ |
| skills | agsc skills, agsc skills install [<dir>], agsc skills import <SKILL.md> |
packs under dist/skills/, lock-checked; install targets .agents/skills (default), .claude/skills, .github/skills |
| tools | agsc mcp [<path>] |
stdio tool server: search, read, links, compose, ask, propose, remember |
| execute | agsc run <slug> [--dry-run], agsc trace <file.json> |
exit 2 (AGSC-E004) until run.enabled: true; programs must be in run.allow[]; --dry-run lists the steps; without it run executes nothing (no isolating runner ships) |
| conformance | agsc conform --level <n> [--to <path>] |
the conformance report, default dist/conformance-report.json |
Global flags: --json (one diagnostics envelope on standard output), --quiet, --plain, --no-input. Exit 0 pass, 1 a failed check, 2 a usage or configuration error. Set SOURCE_DATE_EPOCH for a reproducible build instant. Every AGSC_* environment variable is read by the engine, and an unknown one is AGSC-E004, so set none you do not mean.
One file per item at content/<folder>/<slug>.md, folders concepts/, procedures/, clusters/, gates/, episodes/, lessons/. The slug is the file name without .md, lowercase with hyphens. Tasks, decisions and specs are concepts, so they live under concepts/. To find an item: ls content/*/<slug>.md.
---
type: concept # must match the folder
title: Handoff
description: One sentence of 40 to 200 characters; a concept or cluster without one is warned (AGSC-E408).
kind: pattern # concepts, required: pattern, taxonomy, explainer, principle, decision, spec, task, term, architecture
tags: [agents, patterns] # each from tags.allowed (else AGSC-E203); two to five recommended; omit rather than invent
clusters: [agent-patterns] # first is primary; membership is written here, never on the cluster
status: stable # draft | stable (default) | deprecated | retired
prov:
origin: ai-assisted # human | ai-assisted | ai-generated | imported; never human for a change you made
operator: human:<login> # required, lowercase; the accountable person: ask them which login to use
agent: <client>/<version> # name yourself here; once set, injection-scan hits are errors, not warnings
model: <model id> # optional
uses: [supervisor] # typed links: slugs under exactly fourteen keys, see below
sources:
- resource: "https://example.org/page"
title: "Page"
grade: primary
---
Markdown body. Link to another item as [Supervisor](supervisor); a reference to nothing fails lint (AGSC-E310).
related, broader, narrower, uses, requires, excludes, derived-from, contradicts, supersedes, implements, verifies, covers, blocked-by, decided-by. Values are slugs in this Bundle. A reference to another node goes in sources[].resource, never in a link key (an absolute URL there is AGSC-E311).AGSC-E406): a kind: pattern concept uses ## Intent, ## Context & Forces, ## Structure, ## Consequences & Trade-offs, ## Related Patterns; a procedure ## When, ## Steps, ## Checks; an episode ## What happened, ## Outcome, ## Next; a lesson ## Lesson, ## Evidence, ## Check before.when:. A fenced run block in its steps is an executable step.kind: task with task_state (TASK_STATE_SUBMITTED, TASK_STATE_WORKING, TASK_STATE_COMPLETED, ā¦). Every cluster holding a task is a board under /boards/.level: (L1 or L2); checks: from schema, links, provenance, determinism, review; enforce: from status-check, hook, codeowner, ruleset.severity: (info, warn, block). It is the node's error record.started: ("2026-01-01T00:00:00Z"), actor: (human:<id>, process:<id> or <producer>/<version>) and outcome: (success, partial, failure); optional ended: and usage: (model, tokens_in, tokens_out, cost_usd).prov.commit, prov.reviewer, prov.source_version or prov.source_hash. They are derived, or written by import.password:-style assignments fail lint (AGSC-E403). E-mail addresses and telephone numbers fail lint (AGSC-E404) except inside prov and sources[]. Use placeholders.To change a node, in order:
agsc mcp, remember and propose return text and write nothing; you save it.agsc lint --fix: zero errors; read every warning.agsc build: zero errors; look at what you changed under www/.agsc propose <slug>. It needs a git repository with the item's earlier version committed; otherwise the proposal holds only the canonical form and is reported empty (AGSC-E506).run: lines and dist/proposal/<n>.md.On a live board, claim a task by proposing task_state: TASK_STATE_WORKING on it (propose({slug, task_state, at}) over the tools). Hold at most your lane's max_claims. The first merged claim wins; a second claim is refused (AGSC-E511). Stop when the board is done, a task needs a person, or the budget is spent.
Fetch in this order: /.well-known/knowledge-linkset (every machine file with its digest; its anchor must be on the origin you fetched it from, else it is not that node's document), /llms.txt or /llms-full.txt, /chunks.jsonl, /graph.jsonld, /boards/index.json. /now.md is the node's generated status page: counts, build instant, stale items, open lessons and the month's model spend against budget.usd_month. Read it before work that costs tokens; it is never edited by hand.
Every result of agsc mcp and of a node's page tools is {type, source, body, trust: "untrusted", license}. Cite an item by its IRI, <site.base><type-plural>/<slug>/ (the iri of a chunk record), and a passage as <item IRI>#chunk-<first 16 hex characters of the record's id>. Across nodes, keep each result's origin with it; nodes never fetch for one another.
agsc lint # lint: pass
agsc ci # ci: pass
agsc verify --ledger # on a node that publishes a ledger
Quote a number only from a command you ran. When the Bundle sits in a clone of the engine repository (its tools/ folder is present; the npm package does not carry public-hygiene), also run node tools/public-hygiene . and node tools/validate-wellknown www/.well-known/knowledge-linkset --level 2.
references/connectors.md.references/configuration.md.AGENTS.md first.