⏳ This skill is pending AI review.

Scores will appear once the review pipeline completes.

version unknown

agentfootprint

@footprintjs⭐ 20 stars

Use when building AI agents with agentfootprint — LLMCall, Agent, skills, RAG, memory, control flow, Swarm concepts, mock/anthropic/openai/ollama providers, tools, recorders, resilience, and streaming. Also use when someone asks how agentfootprint works or wants to understand the framework.

Choose how to use this skill

You do not need every option. Choose the path your AI client supports. The stable page stays the same; versioned files are immutable.

1. Native installer

This listing has no registered native installer command. Use the complete package or source fallback below, depending on what your client supports.

Do not guess an installer command or replace an existing version without reviewing the diff.

2. Complete package recommended

Download the ZIP when available. It includes SKILL.md plus the references, security notes and version metadata.

No complete ProSkills package is published for this listing yet.

3. Prompt-only

Copy the prompt above when the agent can read the stable page or when you want to adopt the workflow without installing a skill.

Need only the instruction file?

Download SKILL.md only if your client requires a single file. The complete ZIP is safer for a full installation because it preserves the references and release context.

No path installs or executes anything by itself. Your agent still needs access to the project files. Before updating, compare the installed version and review the diff.

—/10

// RATINGS

⭐GitHub Stars
⭐⭐ 20 on GitHubGitHub ↗

Growing

🟢ProSkills Score
—
📍

Not yet listed on ClawHub or SkillsMP

// README


The new error class

For decades, software had two kinds of errors — and developers never needed deep domain knowledge to fix either:

Error classWhere the bug livesHow you find it
Infrastructure — crash, timeout, 500the systeminfra logs, monitoring
Business logic — wrong branch, wrong maththe codestack trace, debugger, console.log
Contextual — wrong tool chosen, wrong fact believed, stale memory trustedwhat the model was givennothing. Until now.

Agents introduced the third class. The code is correct, the infra is healthy, the answer even reads well — and the run is still wrong, because something influenced the model:

The model…because…
picked the wrong tooltwo descriptions read nearly alike — it chose between twins
believed a wrong "fact"a tool returned it, or an injected fact planted it
followed the wrong instructionthe wrong skill / steering fired — or fired one iteration too early
answered from the pasta previous turn or stale memory bled into this one

Classical logs can't explain any of it: they record what the code did, never what the context did. The debugging question changed — no longer "what did my code do?" but "who influenced the model?"

The idea

If contextual errors live in what the model was given, then the run itself must be structured so context is evidence — every injection, read, write, decision, and tool call recorded connected, the moment it happens. Not logs you grep. Evidence you ask.

Quick start — runs offline, no API key

npm install agentfootprint footprintjs
import { Agent, defineTool } from 'agentfootprint';
import { mock } from 'agentfootprint/providers';

const weather = defineTool({
  name: 'weather',
  description: 'Get current weather for a city.',
  inputSchema: {
    type: 'object',
    properties: { city: { type: 'string' } },
    required: ['city'],
  },
  execute: async ({ city }: { city: string }) => `${city}: 72°F, sunny`,
});

const agent = Agent.create({
  provider: mock({ reply: 'I checked: it is 72°F and sunny.' }),
  model: 'mock',
})
  .system('You answer weather questions using the weather tool.')
  .tool(weather)
  .build();

const result = await agent.run({ message: 'Weather in Paris?' });
console.log(result);  // → "I checked: it is 72°F and sunny."

For production, import a real provider from agentfootprint/providers and swap it in — anthropic(...) / openai(...) / bedrock(...) / gemini(...) / ollama(...). Only the import line changes; the agent code stays the same. (Every provider — mock included — lives on the agentfootprint/providers subpath, so the main agentfootprint barrel stays free of optional peer-dep requires.)

No cloud account? ollama('llama3.2') from agentfootprint/providers runs the same agent against a local model for $0 — the free rung between the mock and the bill. Full recipes: Ollama · OpenAI-compatible endpoints.

What a tool returns — three helpers, one rule

Whatever a tool returns is what the model reads next. When that value has limits the model must not lose, return it through one of three helpers — each is the tool's response; nothing is added to the system prompt or the tool's schema:

helperuse it whenthe model readsthe record keeps
describedResult({ … })rows, a series or relationships from a system of recordthe data, with grain, provenance and one not_covered line per gapthe whole envelope (tools.semantics_declared)
coverage(value, { … })any other value that has limitsyour value, with what was and was not checkedtools.coverage_declared
absent({ … })nothing matchedwhat was looked for, where, and that a retry returns the sametools.absent

Never wrap one in another. Add .limitsTravelWithTheAnswer() and the declared coverage is appended to the final answer — or, for a typed .outputSchema() answer, returned beside it as data by agent.answerCoverage(). Provenance and grain never are.

import { absent, coverage, describedResult } from 'agentfootprint';

execute: ({ vm, summary }) => {
  const { exportedAt, source, runs: all } = backupExport;   // your system of record
  const runs = all.filter((r) => r.vm === vm);
  const ground = { checked: [`every backup job in the export of ${exportedAt}`] };
  if (runs.length === 0) return absent({ what: `backup runs for ${vm}`, ...ground });  // nothing matched
  if (summary) return coverage(`${vm}: ${runs.length} backup runs`, ground);           // a verdict with limits
  return describedResult({                                                             // rows from the record
    facts: runs.map((r) => ({ entity: vm, day: r.day, ok: r.ok === 1 })),
    provenance: { measuredAt: exportedAt, source },   // the time comes from the data
    coverage: ground,
  });
},

What the model reads from each, exactly: Tools → what execute returns.

How — we abstract context engineering

Skills, steering, RAG, facts, memory, guardrails — every name for context does one thing: it injects into one of three LLM slots. So we abstracted the injection itself.

// HOW IT'S BUILT

KEY FILES

ai-instructions/claude-code/SKILL.mdREADME.md

// REPO STATS

20 stars