Skip to content
Back to skills

Add Framework Internal Layer

ASecurity

Use when an F-block touches the internal layer — workbench/, scripts/, AGENTS.md or the repo root, mcp/ excepted. Coherence and dependency checks, the rename/remove sweep, and why the graph gates still apply.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 29, 2026
developmentgobashnodegit

Works with

  • cli
  • mcp

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add brabos-ai/code-addiction --skill add-framework-internal-layer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Add Framework Internal Layer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Add Framework Internal Layer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/brabos-ai-add-framework-internal-layer/badge)](https://www.skillsdirectory.com/skills/brabos-ai-add-framework-internal-layer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: add-framework-internal-layer
description: "Use when an F-block touches the internal layer — workbench/, scripts/, AGENTS.md or the repo root, mcp/ excepted. Coherence and dependency checks, the rename/remove sweep, and why the graph gates still apply."
---

# Internal Layer Mechanics

<!-- uses:
- skill: building-commands
- skill: add-framework-development
- skill: add-artefact-graph
- mention: add-build-ledger
- mention: add-framework--done
-->

Loaded on the first `[internal]` F-block of a build. These artefacts are the development tooling that
builds and maintains the framework. **They are built to more than one provider, and they reach no user.** WHAT gets recorded about
execution is `add-build-ledger`'s job; the product layer has its own skill.

## When to Use

- An F-block naming `workbench/`, `scripts/`, `AGENTS.md`, `.gitignore`, or a repo-root file.

## When NOT to Use

- An F-block naming `framwork/.codeadd/`, `framwork/provider-map.json`, `cli/` or **`mcp/`** —
  the last sits at the repository root and is product anyway, because `scripts/build.js` copies
  it into the npm package. Shipping decides the layer, not depth in the tree.

---

## What the Internal Layer Is

| Type | Path |
|------|------|
| Commands | `workbench/commands/*.md`, namespace `add-framework--*` |
| Pipeline stages | `workbench/skills/add-framework--<stage>/SKILL.md` — brainstorm, plan, build and done are skills in the same namespace, so each can load the next |
| Skills | `workbench/skills/<name>/SKILL.md`, subdocs in `references/` |
| Agents | `workbench/agents/*.md` |
| Support scripts | `scripts/*.js` |
| Structural map | `AGENTS.md` |

```
⛔ A WORKBENCH ARTEFACT IS REGISTERED IN ITS OWN REGISTRY, NEVER THE PRODUCT'S:
  ⛔ DO NOT: Add a workbench command, skill or agent to framwork/provider-map.json
  ⛔ DO NOT: Copy a workbench artefact into framwork/.codeadd/
  ✅ DO: Create it at its workbench/ path AND register it in workbench/provider-map.json
  ✅ DO: Run `node scripts/build-workbench.js` — `scripts/build.js` never sees it
```

**The internal layer HAS a provider mirror, and still ships to nobody. Both halves are true and
neither survives alone.**

| Half | What it means | What breaks if it is dropped |
|---|---|---|
| It has a provider mirror | `workbench/{commands,skills,agents}/` is source; `scripts/build-workbench.js` compiles it into the repository-root `.claude/`, `.opencode/`, `.agents/` and `.codex/`, which are gitignored output | Someone edits the generated copy, and the next build overwrites it |
| It reaches no user | Nothing here is in `framwork/provider-map.json`, nothing is packaged by `release.yml`, and `cli/src/installer.js` never writes it | The cross-layer gate in `scripts/build.js` looks wrong, and a product artefact starts naming a workbench command a user does not have |

⛔ **Edit the SOURCE, never the built copy.** A change made under `.claude/commands/`,
`.claude/skills/`, `.claude/agents/`, the `.opencode/` equivalents or the `.agents/`/`.codex/`
output trees is gitignored and is erased by the next `node scripts/build-workbench.js`.

`add-framework-development` carries the artefact anatomies, the agent frontmatter fields and the
`<!-- uses: -->` syntax. Read it when creating a new internal artefact.

**A remove or a rename is not done when the file is gone.** It is done when nothing names the old
target. The lifecycle actions themselves are layer-neutral and live in the executing command; what
follows is what proves an internal one landed.

---

## Validation

### Every internal F-block

```bash
ADD_GRAPH_WARNINGS=1 node scripts/build.js
```

Exit 0, and no warning absent from the baseline measured before the first F-block. **`build.js`
summarises warnings as a count unless `ADD_GRAPH_WARNINGS=1` is set**, so the bare form cannot
support a "no new warning" claim. **This applies to the internal layer even though the internal layer
is not built.** `build.js` is where the three artefact-graph gates run, and the graph covers `workbench/` as
well as `framwork/.codeadd/`. **`add-framework-development` § 9 owns which conditions fail and which
warn** — read its gate table. Its unregistered-artefact row is the one that does not apply here:
internal artefacts are never in `provider-map.json`.

An internal-only change writes nothing under `framwork/` except the gitignored
`artefact-graph.json`. Prove it:

```bash
git status --porcelain framwork/    # must be empty
```

### AGENTS.md is not bookkeeping

An `[internal]` F-block may write `AGENTS.md`, but **only where the plan told it to**. There is no
standing duty to bring it in step with whatever the build happened to change.

Its inventory block is generated — `node scripts/inventory.js` writes it and `/add-framework--done`
keeps it current. Never hand-edit between the markers; the next close-out overwrites it.

Everything else in the file changes because a plan decided it should. A build that reaches for
`AGENTS.md` on its own initiative is doing what grew it to 4212 words before commit 47321fd cut it
back.

### Coherence, per modified artefact

- [ ] Well-formed markdown, correct structure for its type
- [ ] Command, skill or agent: passes `## The Ruler` of `building-commands`, all eight items
- [ ] `<!-- uses: -->` matches what the prose actually names

### Dependency, per removed or renamed artefact

- [ ] No command, skill or agent declares the old target in `uses:`
- [ ] No prose names it
- [ ] Nothing lost its only consumer — the graph answers this; `add-artefact-graph` names the verb

**A newly created artefact is an orphan until the F-block that wires it lands.** That is expected.
What is not expected is an orphan still present at the end of the build.

### The sweep — grep is not redundant with the gate

```bash
grep -rn "<old-name>" workbench/ AGENTS.md
```

Run it after every remove and every rename. **The prose gate does not catch everything a human reads
as a broken pointer**, and `AGENTS.md` is not a graph node at all, so nothing in `build.js` inspects
it. The grep is the real proof.

---

## Before a Removal or a Rename — Ask the Graph

**Two questions, and `add-artefact-graph` resolves each to its verb:**

1. Who declares this artefact today, and is that answer complete?
2. What does it declare?

⛔ **DO NOT name a verb from memory.** Load the skill. It owns which verb answers which question,
when one query is not enough, and the standing list of what no query reaches — and a verb named here
is a verb that gets run once while a second caller goes unseen.

Every artefact question 1 returns must be edited in the SAME F-block as the removal or rename, or the
block's `build.js` run fails on a dangling declaration.

Risk grading at planning time is a different question and belongs to the planning command, not here.

## Common Rationalizations (BLOCKED)

| Excuse | Reality |
|--------|---------|
| "The internal layer isn't built, so build.js is irrelevant" | It is where the graph gates run |
| "I deleted the file, the rename is done" | Sweep first. A dangling declaration fails the build |
| "The gate passed, so no reference is stale" | `AGENTS.md` is not a node. Grep it |
| "This artefact belongs in provider-map too, for symmetry" | It ships to nobody. Registering it is wrong |
| "The new skill shows as an orphan, something broke" | Expected until its consumer lands. Not at the end |

## Rules

ALWAYS:
- Run `build.js` on an internal F-block and prove `framwork/` stayed clean
- Sweep with grep after every remove and every rename
- Ask the graph who declares an artefact before removing or renaming it, and edit every caller it
  returns in that same F-block

NEVER:
- Register an internal artefact in `framwork/provider-map.json` — its own is `workbench/provider-map.json`
- Leave an artefact orphaned at the end of a build

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.