ANTIGRAVITY LABJP
Articles/Agents & Manager
Agents & Manager/2026-08-21Intermediate

Why I Check Description Overlap Before Turning On inheritCustomizations

CLI 1.1.14 collapsed markdown agent inheritance into a single inheritCustomizations switch. Here is what happened when I actually inventoried the 47 skills in my workspace and decided the switch on description overlap rather than on context size.

antigravity441antigravity-cli10agents133skills3

Premium Article

I was reading through the CLI 1.1.14 notes from August 18 when inheritCustomizations stopped me. One line: markdown-defined agents now inherit skills, rules, plugins, subagents, and MCP servers through a single switch.

Before this, the defaults differed per category. I had been caught by that more than once — believing something was inherited when only part of it actually was. Consolidating it is a real improvement. But the moment it consolidated, a decision that used to be fuzzy landed squarely back in my hands.

Pass everything through, or turn it off and name what I need explicitly.

My first instinct was "I have too many skills, this will be heavy, set it to false." When I actually counted, that instinct turned out to be wrong.

One switch made the decision harder, not easier

When the defaults varied by category, my mistakes were partial. An MCP server would quietly fail to be inherited, I would notice, and I would fix that one thing.

With a single switch, the mistakes are wholesale. Set it true and a whole group goes through; set it false and I list things one by one. Either way the effect reaches every agent that inherits from that definition.

So before deciding, I wanted to see what I actually had. I work as an indie developer, so app maintenance and site operations share one workspace, and the skills directory had been growing by accretion for a long time without a single audit.

Sixty lines to inventory the inheritance candidates

I wrote a script that takes skill directories and reports body size and description health. Nothing clever: read description out of the SKILL.md frontmatter, split it into tokens, and look at the overlap.

Because my descriptions mix Japanese and English, I treat both alphanumeric words and CJK bigrams as tokens. A morphological analyzer would be more accurate, but I only needed enough signal to answer "are these two too similar."

#!/usr/bin/env python3
"""Inventory the skills that are candidates for inheritance.
Usage: python3 skill_inventory.py <skills-directory> [...]
Each <name>/SKILL.md directly under a given directory counts as one skill.
"""
import re
import sys
import statistics
from pathlib import Path
from collections import Counter, defaultdict
 
FM = re.compile(r"\A---\r?\n(.*?)\r?\n---\r?\n", re.S)
DESC = re.compile(r"^description:\s*(.*)$", re.M)
# Handle mixed-language descriptions: alphanumeric words plus CJK bigrams
WORD = re.compile(r"[A-Za-z][A-Za-z0-9_-]{2,}")
CJK = re.compile(r"[ぁ-んァ-ヶ一-龠]{2,}")
 
 
def tokens(text):
    t = {w.lower() for w in WORD.findall(text)}
    for run in CJK.findall(text):
        for i in range(len(run) - 1):
            t.add(run[i:i + 2])
    return t
 
 
def collect(roots):
    skills = []
    for root in roots:
        for path in sorted(Path(root).glob("*/SKILL.md")):
            raw = path.read_text(encoding="utf-8", errors="replace")
            fm = FM.match(raw)
            desc = ""
            if fm:
                m = DESC.search(fm.group(1))
                if m:
                    # Strip YAML quotes; plenty of files do not use them at all
                    desc = m.group(1).strip().strip('"').strip("'")
            skills.append({"name": path.parent.name, "body": len(raw), "desc": desc})
    return skills
 
 
def main(roots):
    skills = collect(roots)
    if not skills:
        print("No SKILL.md found")
        return 1
 
    body = [s["body"] for s in skills]
    desc_total = sum(len(s["desc"]) for s in skills)
    dead = [s["name"] for s in skills if not s["desc"]]
 
    print(f"skills            : {len(skills)}")
    print(f"body total        : {sum(body):,} chars")
    print(f"body median / max : {int(statistics.median(body)):,} / {max(body):,} chars")
    # Guard against division by zero when every description is missing
    ratio = sum(body) // desc_total if desc_total else 0
    print(f"description total : {desc_total:,} chars (1/{ratio} of body)")
    print(f"missing desc      : {len(dead)} {dead}")
 
    tok = {s["name"]: tokens(s["desc"]) for s in skills if s["desc"]}
    freq = Counter()
    for t in tok.values():
        freq.update(t)
 
    overlap = defaultdict(list)
    for a, ta in tok.items():
        for b, tb in tok.items():
            if a >= b or not ta or not tb:
                continue
            j = len(ta & tb) / len(ta | tb)
            if j >= 0.25:
                overlap[round(j, 2)].append((a, b))
 
    print("\n--- pairs with 25%+ description overlap ---")
    if not overlap:
        print("none")
    for j in sorted(overlap, reverse=True):
        for a, b in overlap[j]:
            print(f"  {j:.2f}  {a}  <->  {b}")
 
    print("\n--- tokens appearing in 5+ descriptions (useless for selection) ---")
    noisy = [(w, c) for w, c in freq.most_common(24) if c >= 5]
    print("  " + ", ".join(f"{w}({c})" for w, c in noisy))
    return 0
 
 
if __name__ == "__main__":
    sys.exit(main(sys.argv[1:] or ["."]))

The a >= b check keeps each pair from being counted twice. The 0.25 threshold is simply the lowest value where almost no unrelated pairs showed up in my directory — adjust it for yours.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You will be able to decide inheritance from measured numbers in your own skill directory instead of guessing
You will catch the case where an agent picks the wrong sibling skill before it happens, rather than after you have spent half a day tracing it
You will understand why rewriting descriptions only moves overlap from 0.89 to 0.77, so you can skip the rewrite entirely
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Agents & Manager2026-06-28
The Day the Article I Asked It to Format Became the Agent's Instructions
When you run an unattended content-formatting pipeline with Antigravity CLI, instruction-like text buried in the file you are processing can hijack the agent. Here is how I separate the instruction channel from the data channel and add an output-scope acceptance gate to reject anything out of bounds.
Agents & Manager2026-07-15
The File Is Right There in ls, and Your Agent Still Can't Open It
The agent says the file does not exist. Your terminal says it does. After three days of blaming cloud sync, the answer turned out to be that one voiced consonant mark was never a single character. Detection script and a three-layer gate included.
Agents & Manager2026-07-08
Measuring the Rework Rate of What You Delegate to Agents: Drawing Delegation Boundaries with Numbers, Not Instinct
How much should you hand to an agent? I drew that line by instinct for a long time. Here is a practical way to compute a per-category rework rate from your git history and redraw the delegation boundary with numbers, with working code.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →