Best for
- Use when creating vault cards, checking vault health, running schema compliance, deduplicating entities, generating MOC indexes, running decay cycles, bootstrapping a vault, fixing wikilinks, finding orphans or backlink…
smixs/iva-agent/scripts/autograph/docs/SKILL.md
Schema-as-code enforcement for any Obsidian vault. Zero hardcoded domains. Use when creating vault cards, checking vault health, running schema compliance, deduplicating entities, generating MOC indexes, running decay cycles, bootstrapping a vault, fixing wikilinks, finding orphans or backlinks, extracting entities from daily files, or touching/promoting cards. Do NOT use for content generation or non-vault file operations.
Decision brief
One schema. One graph. Works on any vault.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/smixs/iva-agent --skill "scripts/autograph/docs"Inspect the Agent Skill "autograph" from https://github.com/smixs/iva-agent/blob/16411ca0b2816d5e5969c0c12cd9163603a660f3/scripts/autograph/docs/SKILL.md at commit 16411ca0b2816d5e5969c0c12cd9163603a660f3. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
When to use: New vault, bulk import, first setup. Run once, then switch to HEALTH.
When to use: Daily upkeep, after edits, or when health score drops. This is the most common workflow.
When to use: Recording any card, or new information about something the vault may already track. Always look up first, always link immediately — a near-duplicate is the most common mistake; an orphan card is wasted knowledge.
bash uv run scripts/autograph/search.py "" --vault --json
When to use: Looking up information in the vault, or strengthening weak areas of the graph.
Permission review
The documentation asks the agent to run terminal commands or scripts.
**Always run Phase 2B (agent swarm).** Script alone cannot classify unstructured content.The documentation asks the agent to run terminal commands or scripts.
python3 scripts/autograph/orchestrate.py health <vault-dir> # automated health workflowEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 187 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
One schema. One graph. Works on any vault.
No hardcoded domains, types, or paths. The agent discovers structure from data, builds a schema, then enforces it. All scripts share common.py. Zero external dependencies (stdlib only, API calls via urllib).
| Workflow | When to use | Entry point |
|---|---|---|
| BOOTSTRAP | New vault / after import / first setup | discover.py → enforce.py → graph.py health |
| HEALTH | Daily maintenance / on request | graph.py health → fix → moc → decay |
| CREATE / UPDATE | New knowledge card, or new info about an existing one | search.py dedup → ADD/UPDATE/SUPERSEDE → link → touch |
| SEARCH & LINK | Find info + strengthen connections | Hub → links → target; graph.py orphans → connect |
| ORCHESTRATE | Automated multi-agent workflows (no API keys) | orchestrate.py health|bootstrap |
| DAILY → CARDS | Turn a day's raw notes into linked cards | daily.py extract → dedup-first process → link |
When to use: New vault, bulk import, first setup. Run once, then switch to HEALTH.
Full guide: references/bootstrap-workflow.md
uv run scripts/autograph/discover.py <vault-dir> --verbose > /tmp/discovery.jsongenerate_schema.py) + agent swarm (swarm_prepare.py → Wave 1 haiku → swarm_reduce.py → Wave 2 sonnet). NEVER skip the swarm.engine.py init + enforce.py --applylink_cleanup.py --apply (before enrichment)enrich.py tags --apply (via OpenRouter API)dedup.py --apply (before link enrichment)enrich.py swarm-links --apply (always swarm-links, never links)moc.py generategraph.py health + enforce.py → target 90+/100swarm-links, not links (0.3% vs 81.6% match rate).--apply before applying.When to use: Daily upkeep, after edits, or when health score drops. This is the most common workflow.
1. Run `graph.py health <vault-dir>` → check score
2. If health < 90 → investigate:
a. broken_links > 0 → `graph.py fix <vault-dir> --apply`
b. orphans > 5 → connect orphans to hub files (see Workflow 4)
c. desc_coverage < 70% → add descriptions to files missing them
3. Run `moc.py generate <vault-dir>` → regenerate indexes
4. Run `engine.py decay <vault-dir>` → recalculate relevance + tiers
5. Run `graph.py health <vault-dir>` → confirm improvement
| Metric | Good | Action needed |
|---|---|---|
| Health score | ≥90 | <90: investigate broken links, orphans |
| Broken links | 0 | >0: graph.py fix --apply |
| Orphan files | <5 | ≥5: connect to hubs (Workflow 4) |
| Description coverage | ≥80% | <70%: add descriptions |
| Stale cards (>90d) | <20% | >30%: engine.py creative to resurface |
uv run scripts/autograph/graph.py health <vault-dir> # health check
uv run scripts/autograph/graph.py fix <vault-dir> --apply # fix broken links
uv run scripts/autograph/moc.py generate <vault-dir> # regenerate MOCs
uv run scripts/autograph/engine.py decay <vault-dir> # decay cycle (Ebbinghaus)
uv run scripts/autograph/engine.py decay <vault-dir> --dry-run # preview decay changes
uv run scripts/autograph/engine.py stats <vault-dir> # tier distribution
uv run scripts/autograph/engine.py creative 5 <vault-dir> # resurface forgotten cards
When to use: Recording any card, or new information about something the vault may already track. Always look up first, always link immediately — a near-duplicate is the most common mistake; an orphan card is wasted knowledge.
uv run scripts/autograph/search.py "<entity / key phrase>" --vault <vault-dir> --json
# fallback: grep -ril "<name>" <vault-dir>
Pick the operation (full rules: references/update-in-place.md):
description, append a dated line under ## Log, re-touch.## History (- 2026-06-01: company: TDI Group (held 2026-03→2026-06)), set updated:. Writing through Iva's write_card? Pass the displaced fact as history_entry — the tool owns that section. Whole card obsolete → status: superseded + superseded_by: [[new-card]].Only when the operation is ADD, continue:
node_typesdomain_inference to find target folder:
# domain_inference maps path→domain. To find folder for domain "crm":
for path_prefix, domain in schema['domain_inference'].items():
if domain == 'crm':
target_folder = path_prefix # e.g. "work/crm/"
break
## Related section with [[hub]] file of the domain
_index.md or MEMORY.md of that domain
b. Find 2-3 sibling cards of same type+domain → add [[links]]uv run scripts/autograph/graph.py backlinks <vault> <hub> → find siblingsuv run scripts/autograph/engine.py touch <new-file>Templates: references/card-templates.md
When to use: Looking up information in the vault, or strengthening weak areas of the graph.
_index.md or MEMORY.md of that domainuv run scripts/autograph/graph.py backlinks <vault> <target> for reverse linksuv run scripts/autograph/graph.py orphans <vault-dir> # find orphans
# For each orphan: connect to nearest hub or sibling card
# Files with <2 links → enrich
OPENROUTER_API_KEY=sk-... uv run scripts/autograph/enrich.py swarm-links <vault-dir> --apply
uv run scripts/autograph/graph.py health <vault-dir> # verify improvement
When to use: Instead of running scripts manually. No API keys — the Claude Code agent does all judgment directly.
python3 scripts/autograph/orchestrate.py health <vault-dir> # automated health workflow
python3 scripts/autograph/orchestrate.py bootstrap <vault-dir> # full bootstrap (one command)
health runs: graph check > fix broken links > link cleanup > MOC > decay > verify.
bootstrap runs: enforce > cleanup > tags > dedup > swarm-links > MOC > verify.
The agent (you) does the judgment directly — read prepared data, decide, write results.
# Phase 1: prep dedup clusters for YOUR review
python3 scripts/autograph/orchestrate.py dedup-prepare <vault-dir>
# -> writes .graph/dedup-review-input.json
# -> YOU read clusters, mark approved=true, then: dedup.py --apply-manifest
# Phase 2: prep domain catalogs for YOUR link suggestions
python3 scripts/autograph/orchestrate.py link-prepare <vault-dir>
# -> writes .graph/link-review-input.json
# -> YOU read catalogs, suggest links per domain, write batch results
# Phase 3: prep graph data for YOUR semantic analysis
python3 scripts/autograph/orchestrate.py graph-prepare <vault-dir>
# -> writes .graph/graph-analysis-input.json
# -> YOU analyze contradictions, missing links, stale hubs, write findings
For Phases 1-3: run the prep command, read the output JSON, do the analysis yourself (you ARE the LLM), write results back. Use Agent tool for parallel domain work in Phase 2.
When to use: Turning a daily/YYYY-MM-DD.md note file into durable cards. Judgment-first — the scripts extract candidates; you classify, dedup, and link.
Full guide: references/daily-processor.md
daily.py extract <daily-dir> <vault-dir> [date] (candidates → .graph/) + supersede.py <vault> (conflict scan). Read schema node_types, list noteworthy items + the day's topics.references/update-in-place.md); resolve every .graph/supersede-candidates.json entry.Idempotency: append <!-- autograph-processed: YYYY-MM-DDTHH:MM cards=N --> to the end of the daily file; on re-run, skip content above the last marker. Never edit existing lines.
The decay system models memory with three key mechanisms:
Each touch increments access_count in frontmatter. More retrievals = slower forgetting:
strength = 1 + ln(access_count)
effective_rate = base_rate / strength
relevance = max(floor, 1.0 - effective_rate * days_since_access)
Example: a card touched 5 times has strength = 1 + ln(5) ≈ 2.6, decaying ~2.6x slower than a card touched once.
Different content types decay at different rates. Configure in schema decay.domain_rates:
| Type | Rate | Half-life (~) | Rationale |
|---|---|---|---|
| contact | 0.005 | 100 days | People don't become irrelevant quickly |
| crm | 0.008 | 62 days | Deals have medium lifecycle |
| learning | 0.010 | 50 days | Knowledge fades moderately |
| project | 0.012 | 42 days | Projects have defined timelines |
| daily | 0.020 | 25 days | Daily notes lose relevance fast |
| (default) | 0.015 | 33 days | Fallback for unlisted types |
Touch promotes one tier at a time, not a direct jump to active:
archive → cold → warm → active
Each promotion sets last_accessed to a midpoint date, so without re-touch the card naturally drifts back.
access_count → default=1 → 1+ln(1)=1.0 → rate unchangedtype → default rate appliescalc_relevance(days, schema) → work unchanged (new params optional)uv run scripts/autograph/moc.py generate <vault-dir> # MOC generation
uv run scripts/autograph/engine.py decay <vault-dir> # decay cycle
uv run scripts/autograph/engine.py touch <vault-dir>/path/card.md # touch (graduated)
uv run scripts/autograph/engine.py creative 5 <vault-dir> # creative recall
uv run scripts/autograph/engine.py stats <vault-dir> # stats
uv run scripts/autograph/graph.py backlinks <vault-dir> path/to/card # backlinks
uv run scripts/autograph/graph.py orphans <vault-dir> # orphans
uv run scripts/autograph/graph.py fix <vault-dir> --apply # fix links
uv run scripts/autograph/search.py "<query>" --vault <vault-dir> --json # ranked memory search (dedup-first)
uv run scripts/autograph/supersede.py <vault-dir> # conflict scan (dry-run)
uv run scripts/autograph/supersede.py <vault-dir> --apply # stamp superseded (2-card, newer-by-date)
uv run scripts/autograph/daily.py extract <memory-dir> <vault-dir> # entity extraction
uv run scripts/autograph/engine.py init <vault-dir> --dry-run # bootstrap bare files
OPENROUTER_API_KEY=sk-... uv run scripts/autograph/enrich.py swarm-links <vault-dir> --apply # link enrichment
OPENROUTER_API_KEY=sk-... uv run scripts/autograph/enrich.py tags <vault-dir> --apply # tag enrichment
uv run scripts/autograph/link_cleanup.py <vault-dir> --apply # link cleanup
| Script | Purpose |
|---|---|
| common.py | Shared: parse FM, walk, domain, decay (Ebbinghaus), wikilinks |
| discover.py | Workflow 1: scan vault, output enum candidates |
| generate_schema.py | Workflow 1: turn discovery JSON into draft schema |
| swarm_prepare.py | Workflow 1: bin-pack vault into agent batches |
| swarm_reduce.py | Workflow 1: consolidate + validate schema |
| enforce.py | Workflow 1: validate + autofix against schema |
| link_cleanup.py | Workflow 1/4: remove phantom wikilinks from ## Related |
| enrich.py | Workflow 1/4: tags + swarm-links (catalog-oriented link enrichment) |
| dedup.py | Workflow 1: safe merge + .trash/ |
| graph.py | Workflow 2/4: health score, link repair, backlinks, orphans |
| moc.py | Workflow 2: MOC generation per domain |
| orchestrate.py | Workflow 5: multi-agent orchestration (health, bootstrap, dedup-review, link-enrich, graph-analyze) |
| engine.py | Workflow 2/3: decay (Ebbinghaus), touch (graduated), creative, stats, init |
| search.py | Workflow 3/4: ranked memory search (BM25 FTS5 + link-graph rerank) — dedup-first lookup |
| supersede.py | Workflow 3: deterministic same-entity conflict scan → .graph/supersede-candidates.json |
| daily.py | Entity extraction from memory files |
| tests/test_autograph.py | Self-contained tests (temp fixtures) |
| File | In package? | Purpose |
|---|---|---|
| schema.example.json | Yes | Template — copy and customize (includes domain_rates) |
| schema.json | No | Your vault's schema (generated) |
| schema.local.json | No | Local override (gitignored) |
| references/ | Yes | Bootstrap workflow, schema docs, card templates, linking protocol |
| Mistake | Fix |
|---|---|
| Skipping agent swarm in Phase 2 | CRITICAL: always run Step 2B. Script alone cannot classify unstructured content. No exceptions. |
Using deprecated links subcommand | links was removed (0.3% match rate). Only swarm-links is available — 81.6% match rate. |
| Creating cards without linking | Always follow Workflow 3 — link to hub + 2 siblings immediately. Orphan cards are wasted knowledge. |
| Creating a near-duplicate instead of updating | Workflow 3 Step 0 — search.py/grep first. Same subject → UPDATE or SUPERSEDE the existing card, never a second one. |
| Two contradictory Compiled Truths on one subject | SUPERSEDE: rewrite the Compiled Truth, move the old one to append-only ## History. Never leave both standing. |
| Touching archive cards to active directly | Use graduated recall — touch promotes one tier at a time (archive→cold→warm→active). |
| Sending full vault to one agent | Use swarm_prepare.py — bin-packs into ~50K token batches. |
| Running Wave 2 without Wave 1 | swarm_reduce.py prepare needs JSONL in .graph/swarm/classifications/. |
| Using schema.example.json directly | Run discover → generate your own schema.json |
| Description = title repeat | Write specific search snippet |
| Status not in enum | Check schema's node_types |
| Skip dry run | Always run without --apply first |
| Running link enrich before dedup | Creates links to files that get merged/trashed. Dedup first. |
| Missing OPENROUTER_API_KEY | enrich.py reads from OPENROUTER_API_KEY env var. |
| Only running swarm-links once | Run again with --force to enrich ALL files. |
| Command | Default model | Override |
|---|---|---|
| tags | google/gemini-3-flash-preview | --model flag |
| swarm-links | google/gemini-2.0-flash-001 | --model flag |
Both are production-tested. Do not change defaults without benchmarking.
Error: Schema not found → Create schema.json from discover output, or pass path: enforce.py vault/ my-schema.json
Score drops after enforce → New files without frontmatter. Run engine.py init vault/
Dedup picks wrong canonical → Content richness wins. Enrich the right file first, re-run.
Low match rate on swarm-links (<60%) → Check if LLM returns paths instead of stems. Try --force for second pass.
swarm-links shows 0 matched for some batches → Usually network errors. Results are cached — rerun and only failed batches retry.
Frequently asked questions
One schema. One graph. Works on any vault.
The source record exposes this install command: npx skills add https://github.com/smixs/iva-agent --skill "scripts/autograph/docs". Inspect the command and pinned source before running it.
Static rules flagged exec-script in the source; the page lists the matching lines and excerpts.
Alternatives
nexscope-ai/Amazon-Skills
Amazon listing builder and optimizer for sellers. Two modes: (A) Create — build keyword-optimized listings from scratch using keyword lists + product characteristics + AI copywriting, (B) Optimize — audit existing listings, find keyword gaps, score across 8 dimensions, and rewrite with missing keywords. Integrates with amazon-keyword-research for keyword input. Works on 12 Amazon marketplaces. No API key required. Use when: (1) creating a new Amazon listing from keywords, (2) auditing an existin
vibeeval/vibecosystem
Full-stack frontend development combining premium UI design, cinematic animations, AI-generated media assets, persuasive copywriting, and visual art. Builds complete, visually striking web pages with real media, advanced motion, and compelling copy. Use when: building landing pages, marketing sites, product pages, dashboards, generating media assets (image/video/audio/music), writing conversion copy, creating generative art, or implementing cinematic scroll animations.
nexscope-ai/eCommerce-Skills
E-commerce email marketing system builder. Creates complete email automation flows with full copywriting, subject lines, ESP setup instructions, segmentation rules, and annual campaign calendars. Generates copy-paste-ready email sequences for Klaviyo, Omnisend, Mailchimp, or any ESP. Covers welcome series, cart abandonment, browse abandonment, post-purchase, review requests, cross-sell, win-back, VIP/loyalty, replenishment, and sunset flows. Includes A/B test subject line variants, send timing,
open-octo/octo-agent
Use it for content generation and design tasks; the detail page covers purpose, installation, and practical steps.