paperthin 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +15 -12
- package/.github/workflows/ci.yml +17 -0
- package/.github/workflows/release.yml +39 -0
- package/CLAUDE.md +24 -8
- package/README.md +179 -132
- package/assets/map.svg +53 -0
- package/package.json +5 -1
- package/scripts/validate-skills.sh +39 -0
- package/skills/{cross → breadth}/ssotchk/SKILL.md +5 -7
- package/skills/{cross → breadth}/ssotize/SKILL.md +3 -8
- package/skills/depth/factchk/SKILL.md +28 -0
- package/skills/depth/mandela/SKILL.md +41 -0
- package/skills/{single → depth}/re0/SKILL.md +5 -9
- package/skills/depth/re0-git/SKILL.md +38 -0
- package/skills/depth/redteam/SKILL.md +31 -0
- package/skills/{single → depth}/shower/SKILL.md +4 -5
- package/skills/{single/tasting → depth/sip}/SKILL.md +6 -7
- package/skills/single/re0-git/SKILL.md +0 -36
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "paperthin",
|
|
3
|
-
"description": "Plain-Markdown skills that turn old engineering wisdom into reflexes your agent reaches for on its own — on any agent.",
|
|
4
|
-
"skills": [
|
|
5
|
-
"./skills/
|
|
6
|
-
"./skills/
|
|
7
|
-
"./skills/
|
|
8
|
-
"./skills/
|
|
9
|
-
"./skills/
|
|
10
|
-
"./skills/
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "paperthin",
|
|
3
|
+
"description": "Plain-Markdown skills that turn old engineering wisdom into reflexes your agent reaches for on its own — on any agent.",
|
|
4
|
+
"skills": [
|
|
5
|
+
"./skills/depth/factchk",
|
|
6
|
+
"./skills/depth/mandela",
|
|
7
|
+
"./skills/depth/re0",
|
|
8
|
+
"./skills/depth/re0-git",
|
|
9
|
+
"./skills/depth/redteam",
|
|
10
|
+
"./skills/depth/shower",
|
|
11
|
+
"./skills/depth/sip",
|
|
12
|
+
"./skills/breadth/ssotchk",
|
|
13
|
+
"./skills/breadth/ssotize"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
validate:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: actions/setup-node@v4
|
|
14
|
+
with:
|
|
15
|
+
node-version: 22
|
|
16
|
+
- name: Validate the skill catalog
|
|
17
|
+
run: bash scripts/validate-skills.sh
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ['v*.*.*']
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write # create the GitHub Release
|
|
9
|
+
id-token: write # npm provenance via OIDC
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- uses: actions/setup-node@v4
|
|
18
|
+
with:
|
|
19
|
+
node-version: 22
|
|
20
|
+
registry-url: https://registry.npmjs.org
|
|
21
|
+
|
|
22
|
+
- name: Validate the skill catalog
|
|
23
|
+
run: bash scripts/validate-skills.sh
|
|
24
|
+
|
|
25
|
+
- name: Verify tag matches package.json
|
|
26
|
+
run: |
|
|
27
|
+
PKG=$(node -p "require('./package.json').version")
|
|
28
|
+
TAG=${GITHUB_REF_NAME#v}
|
|
29
|
+
test "$PKG" = "$TAG" || { echo "tag $TAG != package.json $PKG"; exit 1; }
|
|
30
|
+
|
|
31
|
+
- name: Publish to npm (public, with provenance)
|
|
32
|
+
run: npm publish --provenance --access public
|
|
33
|
+
env:
|
|
34
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
35
|
+
|
|
36
|
+
- name: Create the GitHub Release
|
|
37
|
+
env:
|
|
38
|
+
GH_TOKEN: ${{ github.token }}
|
|
39
|
+
run: gh release create "$GITHUB_REF_NAME" --title "PaperThin ${GITHUB_REF_NAME#v}" --notes-from-tag
|
package/CLAUDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# PaperThin
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
PaperThin is an agent-agnostic suite of plain-Markdown skills that keep an artifact **clean and true** — hygiene reflexes an agent reaches for on its own. This is the guide for authoring them — and itself a skill artifact, so `re0` it when it drifts. Every skill it names below — `re0`, `factchk`, `redteam`, … — is defined in the shipped catalog, the [README](./README.md).
|
|
4
4
|
|
|
5
5
|
## Philosophy
|
|
6
6
|
|
|
7
|
-
- **Trust the artifact, not the author.** A skill exists to make work read true to someone who wasn't there. The maker's in-session mind is the worst judge of
|
|
7
|
+
- **Trust the artifact, not the author.** A skill exists to make work read true to someone who wasn't there — *clear* (does it read?) and *correct* (is what it claims real?). The maker's in-session mind is the worst judge of either — so a skill either re-derives the work from what's true now, or imports outside eyes to test it.
|
|
8
8
|
- **Single source of truth.** One fact lives in one place; everything else references it by name. Skills compose by naming each other in prose — never by copying content or reaching into another skill's files. Shared material lives in its owning skill; others point to it.
|
|
9
9
|
- **Restraint.** Change only what genuinely improves — a pass that finds nothing to improve changes nothing. The enemy is slop (noise, duplication, padding), not addition.
|
|
10
10
|
- **Recursive.** Every skill is general enough to use *while building the skills*, so we maintain the skills with the skills, and each pass is audited and refined by the tools it ships. Treat that loop as the point.
|
|
@@ -15,12 +15,20 @@ The guide for authoring these skills — and itself a skill artifact, so `re0` i
|
|
|
15
15
|
skills/<perspective>/<name>/SKILL.md
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Topic domains belong in separate plugins, so within a plugin the only durable cut is **perspective**. One skill = one directory with a `SKILL.md`.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
- `cross/` — **breadth**: reconcile one truth across many artifacts and platforms (`ssotchk`, `ssotize`).
|
|
20
|
+
That cut is two orthogonal axes, **cardinality × time**:
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
- `depth/` — **one artifact, now**: refine or verify the thing in hand (`re0`, `re0-git`, `shower`, `sip`, `factchk`, `mandela`, `redteam`).
|
|
23
|
+
- `breadth/` — **many artifacts, now**: reconcile one truth across files and platforms (`ssotchk`, `ssotize`).
|
|
24
|
+
- `coil/` — **one project, across iterations**: carry learning between build cycles *(reserved, v0.7)*.
|
|
25
|
+
- `mesh/` — **many minds, across rounds**: converge many independent views into consensus *(reserved, v0.8)*.
|
|
26
|
+
|
|
27
|
+
**File by trigger-scope, not by what a skill invokes.** A skill lives where the work it *triggers or emits* ranges, even when it orchestrates skills from other folders — `sip` gates one finished deliverable, so it's `depth/`, though its check runs a cross-file `ssotchk`.
|
|
28
|
+
|
|
29
|
+
Reach for `breadth/` to *establish* order (legacy refactor, knowledge-base build, fresh scaffolding); once a fact is cleanly SSOT'd, *maintain* it with `re0` rather than re-consolidating. Keep drafts and retired skills out of the README and `plugin.json`.
|
|
30
|
+
|
|
31
|
+
**Name it for the reflex it fires** — a plain real word (`shower`, `sip`) or a tight compression of a real term (`re0`, `ssotchk`, `ssotize`); a stranger should half-guess what it does from the name alone, so no opaque coinage. A self-evident metaphor-noun is allowed only as a deliberate exception, when its own intuition carries it.
|
|
24
32
|
|
|
25
33
|
## SKILL.md format
|
|
26
34
|
|
|
@@ -28,6 +36,7 @@ Reach for `cross/` to *establish* order (legacy refactor, knowledge-base build,
|
|
|
28
36
|
---
|
|
29
37
|
name: <kebab-name> # matches the directory and the invocation
|
|
30
38
|
description: "<trigger-rich one-liner>"
|
|
39
|
+
# disable-model-invocation: true ← user-invoked skills only
|
|
31
40
|
---
|
|
32
41
|
|
|
33
42
|
<one line: what the skill does>
|
|
@@ -42,7 +51,14 @@ description: "<trigger-rich one-liner>"
|
|
|
42
51
|
|
|
43
52
|
Every `SKILL.md` is either user-invoked (`disable-model-invocation: true`, reachable only by the human) or model-invoked (model- or user-reachable). For the full definitions, description conventions, and why a user-invoked skill can invoke model-invoked skills but never another user-invoked one, see [docs/invocation.md](./docs/invocation.md).
|
|
44
53
|
|
|
45
|
-
Default to model-invoked. Make a skill user-invoked only when the model should never reach it on its own — its trigger is a deliberate, human-decided action (commit, push, publish, deploy), or its mere presence in reach would bias the agent toward one. A user-invoked skill can't be composed, so it also stays out of `
|
|
54
|
+
Default to model-invoked. Make a skill user-invoked only when the model should never reach it on its own — its trigger is a deliberate, human-decided action (commit, push, publish, deploy), or its mere presence in reach would bias the agent toward one. A user-invoked skill can't be composed, so it also stays out of `sip`. Two qualify today: `re0-git` (it cleans a commit's message — committing is human-decided) and `redteam` (a kill-it reflex always in the agent's reach would bias it toward demolition).
|
|
55
|
+
|
|
56
|
+
## Conventions
|
|
57
|
+
|
|
58
|
+
Shared rules a skill references rather than restates:
|
|
59
|
+
|
|
60
|
+
- **edit-safety** (any mutating skill — `re0`, `ssotize`): a find-replace that could match nothing must **assert its target exists** (report a MISS, never silently no-op); byte-level tools corrupt multibyte text, so mutate with a **unicode-safe** pass (`PYTHONUTF8=1`, stdout reconfigured to UTF-8); never **blanket-replace a single target whose right replacement is positional** (the same token mapping to different replacements per location) — decide per occurrence, never a blind sweep; and make large *structural* moves with a script, not by retyping.
|
|
61
|
+
- **negatives-as-corpus**: "cut" means **move-to-archive, never delete** — pruned and failed branches are assets, not waste.
|
|
46
62
|
|
|
47
63
|
## Shipping
|
|
48
64
|
|
|
@@ -52,7 +68,7 @@ Before committing:
|
|
|
52
68
|
2. **README** lists it — grouped Model-/User-invoked, each linked to its `SKILL.md`.
|
|
53
69
|
3. **plugin.json** registers its path.
|
|
54
70
|
4. **package.json** bumps version (new skill = minor; fix/docs = patch); `keywords` stay grouped logically.
|
|
55
|
-
5. Run **`
|
|
71
|
+
5. Run **`sip`** — `shower` the artifact, `ssotchk` the repo, `re0` the docs.
|
|
56
72
|
|
|
57
73
|
Commit messages: Conventional Commits, one bullet per real change — no padding, no mechanical trivia, no co-author tags. `re0-git` cleans a drifted message back to its essence, in the author's own style.
|
|
58
74
|
|
package/README.md
CHANGED
|
@@ -1,132 +1,179 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
# PaperThin
|
|
4
|
-
|
|
5
|
-
<img src="https://raw.githubusercontent.com/LilMGenius/paperthin/main/assets/banner.svg" alt="PaperThin — Trust the artifact, not the author." width="820">
|
|
6
|
-
|
|
7
|
-
Plain-Markdown skills that turn old engineering wisdom into reflexes your agent reaches for on its own — on any agent: Claude Code, Codex, Cursor, Antigravity, Grok-Build, Hermes, OpenClaw, Pi, etc.
|
|
8
|
-
|
|
9
|
-
[Quickstart](#quickstart-15-seconds) · [
|
|
10
|
-
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Quickstart (15 seconds)
|
|
16
|
-
|
|
17
|
-
1. **Install** for every agent you use:
|
|
18
|
-
```bash
|
|
19
|
-
npx skills@latest add LilMGenius/paperthin --global --agent '*'
|
|
20
|
-
```
|
|
21
|
-
2. **Run it elevated** so the skills are symlinked (they auto-update), not copied.
|
|
22
|
-
3. **Use them** — model-invoked, so your agent reaches for them on its own; or call one by name, like `/re0`.
|
|
23
|
-
|
|
24
|
-
**Not sure?** Paste that command into whatever agent you're using and just say "set this up for me" — it'll do the rest.
|
|
25
|
-
|
|
26
|
-
##
|
|
27
|
-
|
|
28
|
-
### Model-invoked — your agent reaches for these on its own
|
|
29
|
-
| Skill | Scope | What it does |
|
|
30
|
-
|---|---|---|
|
|
31
|
-
| ♻️ **[re0](./skills/
|
|
32
|
-
| 🚿 **[shower](./skills/
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
### #
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
**The fix → `
|
|
84
|
-
|
|
85
|
-
> *Prior art:
|
|
86
|
-
|
|
87
|
-
<details>
|
|
88
|
-
<summary><b>[PROOF]</b></summary>
|
|
89
|
-
|
|
90
|
-
- **Setup** — we
|
|
91
|
-
- **Result** —
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
>
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
-
|
|
131
|
-
|
|
132
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# PaperThin
|
|
4
|
+
|
|
5
|
+
<img src="https://raw.githubusercontent.com/LilMGenius/paperthin/main/assets/banner.svg" alt="PaperThin — Trust the artifact, not the author." width="820">
|
|
6
|
+
|
|
7
|
+
Plain-Markdown skills that turn old engineering wisdom into reflexes your agent reaches for on its own — on any agent: Claude Code, Codex, Cursor, Antigravity, Grok-Build, Hermes, OpenClaw, Pi, etc.
|
|
8
|
+
|
|
9
|
+
[Quickstart](#quickstart-15-seconds) · [Index](#index) · [The Map](#the-map) · [The Problem](#the-problem) · [The Fixes](#the-fixes) · [Credits](#credits)
|
|
10
|
+
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Quickstart (15 seconds)
|
|
16
|
+
|
|
17
|
+
1. **Install** for every agent you use:
|
|
18
|
+
```bash
|
|
19
|
+
npx skills@latest add LilMGenius/paperthin --global --agent '*'
|
|
20
|
+
```
|
|
21
|
+
2. **Run it elevated** so the skills are symlinked (they auto-update), not copied.
|
|
22
|
+
3. **Use them** — model-invoked, so your agent reaches for them on its own; or call one by name, like `/re0`.
|
|
23
|
+
|
|
24
|
+
**Not sure?** Paste that command into whatever agent you're using and just say "set this up for me" — it'll do the rest.
|
|
25
|
+
|
|
26
|
+
## Index
|
|
27
|
+
|
|
28
|
+
### Model-invoked — your agent reaches for these on its own
|
|
29
|
+
| Skill | Scope | What it does |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| ♻️ **[re0](./skills/depth/re0/SKILL.md)** | one artifact | Rewrite a drifted artifact into a clean v0 — not another patch |
|
|
32
|
+
| 🚿 **[shower](./skills/depth/shower/SKILL.md)** | one artifact | Cold-read it with fresh, zero-context eyes — does it stand on its own? *(read-only)* |
|
|
33
|
+
| 🔬 **[factchk](./skills/depth/factchk/SKILL.md)** | one claim | Verify a reality-grounded claim against sources, both directions — could the absurd be real, the obvious false? *(read-only → fix)* |
|
|
34
|
+
| 🧪 **[mandela](./skills/depth/mandela/SKILL.md)** | one eval | Audit a validation for leakage — does outside ground-truth actually enter? Walks 8 patterns *(read-only)* |
|
|
35
|
+
| 🔎 **[ssotchk](./skills/breadth/ssotchk/SKILL.md)** | many artifacts | Find where one fact is scattered or duplicated; name the canonical source *(read-only)* |
|
|
36
|
+
| 🧲 **[ssotize](./skills/breadth/ssotize/SKILL.md)** | many artifacts | Consolidate it into one home and point the rest at it |
|
|
37
|
+
| 🥄 **[sip](./skills/depth/sip/SKILL.md)** | your output | After any change, auto-runs `shower` + `ssotchk` + `re0` on it |
|
|
38
|
+
|
|
39
|
+
### User-invoked — you run these yourself
|
|
40
|
+
| Skill | Scope | What it does |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| 🧾 **[re0-git](./skills/depth/re0-git/SKILL.md)** | one commit | Rewrite a finished commit's message into a clean v0 so `git log` alone hands off |
|
|
43
|
+
| ⚔️ **[redteam](./skills/depth/redteam/SKILL.md)** | one plan | Try to kill it before reality does — the one root flaw + the cheapest experiment that falsifies it |
|
|
44
|
+
|
|
45
|
+
## The Map
|
|
46
|
+
|
|
47
|
+
**How many artifacts, and across how much time?**
|
|
48
|
+
|
|
49
|
+
Two axes — **cardinality × time** — carve four regions.
|
|
50
|
+
|
|
51
|
+
<div align="center">
|
|
52
|
+
<img src="https://raw.githubusercontent.com/LilMGenius/paperthin/main/assets/map.svg" alt="The PaperThin map: a two-by-two matrix. Horizontal axis cardinality (one, then many); vertical axis time (now, then across iterations); four regions. Top-left, depth: one artifact, now; is this one thing clean and true? Top-right, breadth: many artifacts, now; is one truth consistent everywhere? Bottom-left, coil: one project, across iterations; did each pass teach the next? Bottom-right, mesh: many minds, across rounds; does the crowd converge on truth?" width="820">
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
## The Problem
|
|
56
|
+
|
|
57
|
+
**Most agent skills are slop.**
|
|
58
|
+
|
|
59
|
+
Point an agent at a goal and it **adds** — more files, more options, more "helpful" boilerplate. Adding looks like progress, and nothing ever makes it go back and delete.
|
|
60
|
+
|
|
61
|
+
> [!WARNING]
|
|
62
|
+
> Repeat that across a project and you get the familiar AI-generated toolkit: near-duplicate skills, dead settings, a README that says the same thing three times. Plausible, busy, and quietly unmaintainable.
|
|
63
|
+
|
|
64
|
+
These skills bet the other way — **every one of them removes:**
|
|
65
|
+
|
|
66
|
+
- `re0` rewrites a draft into a clean v0 instead of patching it,
|
|
67
|
+
- `ssotchk` / `ssotize` collapse the same fact scattered across files,
|
|
68
|
+
- `shower` cuts whatever a stranger can't follow,
|
|
69
|
+
- `sip` runs all of it on your own output, automatically.
|
|
70
|
+
|
|
71
|
+
> [!TIP]
|
|
72
|
+
> The hard part isn't adding features — it's restraint. A pass that finds nothing to improve changes nothing. **That restraint is the product.**
|
|
73
|
+
|
|
74
|
+
## The Fixes
|
|
75
|
+
|
|
76
|
+
<!-- Fixes follow the lifecycle of a piece of work, not the skill list: first keep it clean (draft → read fresh → reconcile across files → automate → ship), then keep it true (a single claim → a validation → the whole plan). Slot any new fix in by where it acts in that arc. -->
|
|
77
|
+
|
|
78
|
+
**Each is a well-worn principle, made automatic.**
|
|
79
|
+
|
|
80
|
+
### #1 — Artifacts rot
|
|
81
|
+
Edit a doc one piece at a time across a session and it bloats: stale deltas, duplicated noise, changelog scars. Patching on top just preserves the rot.
|
|
82
|
+
|
|
83
|
+
**The fix → `re0`:** rewrite the artifact as a clean v0, as if it were the first version.
|
|
84
|
+
|
|
85
|
+
> *Prior art: the Boy Scout Rule — "leave it cleaner than you found it" (Robert C. Martin, [Clean Code](https://www.informit.com/articles/article.aspx?p=1235624&seqNum=6), 2008). `re0` goes further: rewrite, don't just tidy.*
|
|
86
|
+
|
|
87
|
+
<details>
|
|
88
|
+
<summary><b>[PROOF]</b></summary>
|
|
89
|
+
|
|
90
|
+
- **Setup** — we asked `re0` to refresh these docs once more, but they were already at v0.
|
|
91
|
+
- **Result** — it found nothing to improve and left every line of prose untouched.
|
|
92
|
+
- **So** — a tool that does nothing when nothing is wrong never bloats your repo: these skills remove noise, they never add it.
|
|
93
|
+
</details>
|
|
94
|
+
|
|
95
|
+
### #2 — You go blind to your own work
|
|
96
|
+
After a long session you're the one person who *can't* read your own work straight: you know too much, so your brain quietly fills every gap and the holes turn invisible.
|
|
97
|
+
|
|
98
|
+
**The fix → `shower`:** hand a stranger who never saw your session only the artifact, and ask "does this actually make sense?"
|
|
99
|
+
|
|
100
|
+
> *Prior art: [egoless programming](https://en.wikipedia.org/wiki/Egoless_programming) — you can't review your own work objectively; someone else must (Gerald Weinberg, 1971). Here, that someone is a context-free sub-session.*
|
|
101
|
+
|
|
102
|
+
<details>
|
|
103
|
+
<summary><b>[PROOF]</b></summary>
|
|
104
|
+
|
|
105
|
+
- **Setup** — we handed `shower` its own spec, to a sub-session with zero context, holding only the file.
|
|
106
|
+
- **Result** — in minutes it found three bugs the author had missed:
|
|
107
|
+
- a step that hinted the answer it should hide,
|
|
108
|
+
- a path that leaked spoiler files,
|
|
109
|
+
- a scope too vague to act on.
|
|
110
|
+
- **So** — a skill that catches its own bugs can catch yours.
|
|
111
|
+
</details>
|
|
112
|
+
|
|
113
|
+
### #3 — The same fact ends up everywhere
|
|
114
|
+
A timeout value, a decision, a status — copied into a README, a doc, a ticket, and a Slack thread. The copies drift, and now no one knows which is true.
|
|
115
|
+
|
|
116
|
+
**The fix → `ssotchk` + `ssotize`:** find the scatter, name the canonical source, then consolidate and point the rest at it.
|
|
117
|
+
|
|
118
|
+
> *Prior art: [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) — one fact, one authoritative home (Hunt & Thomas, The Pragmatic Programmer, 1999).*
|
|
119
|
+
|
|
120
|
+
### #4 — "Remember to verify" never fires
|
|
121
|
+
A guideline buried in docs won't trigger in a brand-new session — exactly when author bias is highest.
|
|
122
|
+
|
|
123
|
+
**The fix → `sip`:** the moment you finish something, it runs `shower`, `ssotchk`, and `re0` on your output, automatically.
|
|
124
|
+
|
|
125
|
+
> *Prior art: [dogfooding](https://en.wikipedia.org/wiki/Eating_your_own_dog_food) — eat your own dog food (Microsoft, 1988). Taste your own cooking before you serve it.*
|
|
126
|
+
|
|
127
|
+
### #5 — Your session doesn't travel; the git log does
|
|
128
|
+
Your session is stuck where it ran — this agent, this account, this machine. A teammate or another agent can't load the context your work happened in.
|
|
129
|
+
|
|
130
|
+
**The fix → `re0-git`:** clean a finished commit's message so `git log` — the one thing every environment shares — carries the handoff, and anyone picks up from the log alone.
|
|
131
|
+
|
|
132
|
+
<details>
|
|
133
|
+
<summary><b>[PROOF]</b></summary>
|
|
134
|
+
|
|
135
|
+
- **Setup** — `re0-git`'s very first target was its own release commit.
|
|
136
|
+
- **Result** — dogfooding it surfaced two faults, both fixed:
|
|
137
|
+
- a message padded with trivia,
|
|
138
|
+
- a spec that preached "no redundancy" while repeating itself.
|
|
139
|
+
- **So** — its first cleanup was after itself.
|
|
140
|
+
</details>
|
|
141
|
+
|
|
142
|
+
> [!NOTE]
|
|
143
|
+
> The five fixes above keep an artifact **clean**. The next three keep it **true** — the same distrust of the author, turned on the reasoning instead of the prose.
|
|
144
|
+
|
|
145
|
+
### #6 — Your gut isn't a source
|
|
146
|
+
"Plausible," "absurd," "novel" — the least reliable line in any artifact. Human priors fail **both ways**: they exclude the real (desert frogs exist) and normalize the impossible (weightless crates).
|
|
147
|
+
|
|
148
|
+
**The fix → `factchk`:** verify any reality-grounded claim against external sources, in both directions, before it ships — and flag, don't guess, when you can't reach one.
|
|
149
|
+
|
|
150
|
+
> *Prior art: [WEIRD bias](https://www.cambridge.org/core/journals/behavioral-and-brain-sciences/article/abs/weirdest-people-in-the-world/BF84F7517D56AFF7B7EB58411A554C17) (Henrich, Heine & Norenzayan, 2010) and the [naive-physics / impetus error](https://www.science.org/doi/10.1126/science.210.4474.1139) (McCloskey, Caramazza & Green, 1980) — intuition misjudges reality in both directions.*
|
|
151
|
+
|
|
152
|
+
<details>
|
|
153
|
+
<summary><b>[PROOF]</b></summary>
|
|
154
|
+
|
|
155
|
+
- **Setup** — we ran `factchk` on its own shipped citations, in both directions.
|
|
156
|
+
- **Result** — all held, and it still caught two attribution slips to fix: the famous "what's measured becomes the target" wording is Strathern (1997), not Goodhart; and "McCloskey 1980" is the co-authored *Science* paper, not the 1983 *Scientific American* piece.
|
|
157
|
+
- **So** — a fact-checker that audits its own footnotes will audit yours.
|
|
158
|
+
</details>
|
|
159
|
+
|
|
160
|
+
### #7 — The eval confirms itself
|
|
161
|
+
A model, a scorer, and a designer can all agree a result is real while no outside ground-truth ever entered the loop — a whole room confidently remembering something that never independently happened.
|
|
162
|
+
|
|
163
|
+
**The fix → `mandela`:** audit any eval, metric, or experiment against an 8-pattern leakage taxonomy — does external ground-truth enter independently, or is the verifier the designer?
|
|
164
|
+
|
|
165
|
+
> *Prior art: [Goodhart's law](https://en.wikipedia.org/wiki/Goodhart%27s_law), [data leakage](https://dl.acm.org/doi/10.1145/2382577.2382579) (Kaufman et al., 2012), and [circular analysis](https://www.nature.com/articles/nn.2303) — "double dipping" (Kriegeskorte et al., 2009).*
|
|
166
|
+
|
|
167
|
+
### #8 — You can't kill your own plan
|
|
168
|
+
You built it, so you defend it. The questions that would break it are exactly the ones you won't ask.
|
|
169
|
+
|
|
170
|
+
**The fix → `redteam`:** try to kill the plan before reality does — return the single load-bearing flaw and the cheapest experiment that would falsify it (the "first nail"), not a checklist. User-invoked: you point it at a plan deliberately.
|
|
171
|
+
|
|
172
|
+
> *Prior art: [egoless programming](https://en.wikipedia.org/wiki/Egoless_programming) (Weinberg, 1971 — the same root `shower` cites), red-teaming, and fail-fast.*
|
|
173
|
+
|
|
174
|
+
## Credits
|
|
175
|
+
|
|
176
|
+
- **Built on** [mattpocock/skills](https://github.com/mattpocock/skills) (MIT) — its architecture and philosophy.
|
|
177
|
+
- **Not a fork** — these are [LilMGenius](https://github.com/LilMGenius)'s own, non-overlapping workflows.
|
|
178
|
+
- **Vendored verbatim** — a few shared building blocks, kept as-is with per-source attribution in [NOTICE](./NOTICE).
|
|
179
|
+
- **Authoring guide** — conventions and philosophy live in [CLAUDE.md](./CLAUDE.md).
|
package/assets/map.svg
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1080 740" width="1080" height="740" role="img" aria-label="The PaperThin map: a two-by-two matrix. Horizontal axis cardinality (one, then many); vertical axis time (now, then across iterations); four regions. Top-left, depth: one artifact, now; is this one thing clean and true? Top-right, breadth: many artifacts, now; is one truth consistent everywhere? Bottom-left, coil: one project, across iterations; did each pass teach the next? Bottom-right, mesh: many minds, across rounds; does the crowd converge on truth?">
|
|
2
|
+
<rect width="1080" height="740" fill="#FCFCFA"/>
|
|
3
|
+
|
|
4
|
+
<!-- header rule + eyebrow -->
|
|
5
|
+
<line x1="132" y1="74" x2="1024" y2="74" stroke="#DCDBD3" stroke-width="1"/>
|
|
6
|
+
<text x="132" y="56" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="14" font-weight="400" letter-spacing="4.5" fill="#8C8C86">CARDINALITY × TIME — FOUR REGIONS</text>
|
|
7
|
+
|
|
8
|
+
<!-- live row tint (depth + breadth = available now) -->
|
|
9
|
+
<rect x="132" y="96" width="892" height="262" fill="#F4F3ED"/>
|
|
10
|
+
|
|
11
|
+
<!-- matrix frame + internal cross -->
|
|
12
|
+
<rect x="132" y="96" width="892" height="524" fill="none" stroke="#1B1B1A" stroke-width="1.3"/>
|
|
13
|
+
<line x1="578" y1="96" x2="578" y2="620" stroke="#1B1B1A" stroke-width="1"/>
|
|
14
|
+
<line x1="132" y1="358" x2="1024" y2="358" stroke="#1B1B1A" stroke-width="1"/>
|
|
15
|
+
|
|
16
|
+
<!-- depth -->
|
|
17
|
+
<text x="166" y="200" font-family="Georgia,'Times New Roman',serif" font-size="44" fill="#1B1B1A">depth</text>
|
|
18
|
+
<text x="168" y="234" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="17" fill="#6F6F69">one artifact, now</text>
|
|
19
|
+
<text x="168" y="266" font-family="Georgia,'Times New Roman',serif" font-size="16" font-style="italic" fill="#2F5374">is this one thing clean & true?</text>
|
|
20
|
+
|
|
21
|
+
<!-- breadth -->
|
|
22
|
+
<text x="612" y="200" font-family="Georgia,'Times New Roman',serif" font-size="44" fill="#1B1B1A">breadth</text>
|
|
23
|
+
<text x="614" y="234" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="17" fill="#6F6F69">many artifacts, now</text>
|
|
24
|
+
<text x="614" y="266" font-family="Georgia,'Times New Roman',serif" font-size="16" font-style="italic" fill="#2F5374">is one truth consistent everywhere?</text>
|
|
25
|
+
|
|
26
|
+
<!-- coil (forthcoming) -->
|
|
27
|
+
<text x="166" y="462" font-family="Georgia,'Times New Roman',serif" font-size="44" fill="#9A9A93">coil</text>
|
|
28
|
+
<text x="168" y="496" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="17" fill="#9A9A93">one project, across iterations</text>
|
|
29
|
+
<text x="168" y="528" font-family="Georgia,'Times New Roman',serif" font-size="16" font-style="italic" fill="#A6A69E">did each pass teach the next?</text>
|
|
30
|
+
<g transform="translate(466 380)">
|
|
31
|
+
<rect x="0" y="0" width="70" height="25" rx="3" fill="none" stroke="#B6B6AE" stroke-width="1"/>
|
|
32
|
+
<text x="35" y="17" text-anchor="middle" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="12" letter-spacing="1" fill="#8C8C86">v0.7</text>
|
|
33
|
+
</g>
|
|
34
|
+
|
|
35
|
+
<!-- mesh (forthcoming) -->
|
|
36
|
+
<text x="612" y="462" font-family="Georgia,'Times New Roman',serif" font-size="44" fill="#9A9A93">mesh</text>
|
|
37
|
+
<text x="614" y="496" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="16.5" fill="#9A9A93">many minds, across rounds</text>
|
|
38
|
+
<text x="614" y="528" font-family="Georgia,'Times New Roman',serif" font-size="16" font-style="italic" fill="#A6A69E">does the crowd converge on truth?</text>
|
|
39
|
+
<g transform="translate(908 380)">
|
|
40
|
+
<rect x="0" y="0" width="70" height="25" rx="3" fill="none" stroke="#B6B6AE" stroke-width="1"/>
|
|
41
|
+
<text x="35" y="17" text-anchor="middle" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="12" letter-spacing="1" fill="#8C8C86">v0.8</text>
|
|
42
|
+
</g>
|
|
43
|
+
|
|
44
|
+
<!-- x axis labels -->
|
|
45
|
+
<text x="355" y="656" text-anchor="middle" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="15" fill="#5A5A55">one</text>
|
|
46
|
+
<text x="801" y="656" text-anchor="middle" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="15" fill="#5A5A55">many</text>
|
|
47
|
+
<text x="578" y="690" text-anchor="middle" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="13" letter-spacing="3.5" fill="#9A9A93">CARDINALITY</text>
|
|
48
|
+
|
|
49
|
+
<!-- y axis labels -->
|
|
50
|
+
<text x="104" y="227" text-anchor="middle" transform="rotate(-90 104 227)" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="15" fill="#5A5A55">now</text>
|
|
51
|
+
<text x="104" y="489" text-anchor="middle" transform="rotate(-90 104 489)" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="15" fill="#5A5A55">across iterations</text>
|
|
52
|
+
<text x="72" y="358" text-anchor="middle" transform="rotate(-90 72 358)" font-family="'Helvetica Neue',Helvetica,Arial,sans-serif" font-size="13" letter-spacing="3.5" fill="#9A9A93">TIME</text>
|
|
53
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paperthin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Plain-Markdown skills that turn old engineering wisdom into reflexes your agent reaches for on its own — on any agent.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-skills",
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
"dedupe",
|
|
15
15
|
"clean-code",
|
|
16
16
|
"verification",
|
|
17
|
+
"fact-check",
|
|
18
|
+
"leakage",
|
|
19
|
+
"red-team",
|
|
20
|
+
"reasoning-hygiene",
|
|
17
21
|
"documentation",
|
|
18
22
|
"knowledge-base",
|
|
19
23
|
"git"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Validate the skill catalog against the conventions in CLAUDE.md + docs/invocation.md.
|
|
3
|
+
# The single source of truth for "is the catalog shippable" — called by release.yml
|
|
4
|
+
# (pre-publish), ci.yml (every push/PR), and runnable locally (e.g. from sip).
|
|
5
|
+
set -uo pipefail
|
|
6
|
+
cd "$(dirname "$0")/.."
|
|
7
|
+
|
|
8
|
+
fail=0
|
|
9
|
+
err() { echo "::error::$*"; fail=1; } # GitHub annotation on CI; prints plainly off-CI
|
|
10
|
+
|
|
11
|
+
# plugin.json must be valid JSON
|
|
12
|
+
node -e "JSON.parse(require('fs').readFileSync('.claude-plugin/plugin.json','utf8'))" 2>/dev/null \
|
|
13
|
+
|| err "plugin.json is not valid JSON"
|
|
14
|
+
|
|
15
|
+
# the brand one-liner is single-sourced: package.json and plugin.json must agree
|
|
16
|
+
pkg_desc=$(node -p "require('./package.json').description" 2>/dev/null)
|
|
17
|
+
plg_desc=$(node -p "require('./.claude-plugin/plugin.json').description" 2>/dev/null)
|
|
18
|
+
[ "$pkg_desc" = "$plg_desc" ] || err "package.json and plugin.json 'description' differ — keep the brand one-liner in sync"
|
|
19
|
+
|
|
20
|
+
while IFS= read -r f; do
|
|
21
|
+
d=$(dirname "$f"); name=$(awk -F': *' '/^name:/{print $2; exit}' "$f")
|
|
22
|
+
grep -q '^description:' "$f" || err "$f: missing 'description'"
|
|
23
|
+
[ -n "$name" ] || err "$f: missing 'name'"
|
|
24
|
+
[ "$name" = "$(basename "$d")" ] || err "$f: name '$name' != directory '$(basename "$d")'"
|
|
25
|
+
grep -qF "\"./$d\"" .claude-plugin/plugin.json || err "$d: not registered in plugin.json"
|
|
26
|
+
grep -qF "$d/SKILL.md" README.md || err "$d: not listed in README.md"
|
|
27
|
+
grep -q '\.\./' "$f" && err "$f: deep cross-file ref ('../') — compose by naming, not relative links"
|
|
28
|
+
done < <(find skills -name SKILL.md)
|
|
29
|
+
|
|
30
|
+
# every plugin.json skill path resolves to a SKILL.md
|
|
31
|
+
while IFS= read -r p; do
|
|
32
|
+
[ -f "$p/SKILL.md" ] || err "plugin.json: '$p' has no SKILL.md"
|
|
33
|
+
done < <(grep -oE '\./skills/[A-Za-z0-9/_-]+' .claude-plugin/plugin.json)
|
|
34
|
+
|
|
35
|
+
if [ "$fail" -eq 0 ]; then
|
|
36
|
+
echo "✓ skill catalog valid ($(find skills -name SKILL.md | wc -l | tr -d ' ') skills)"
|
|
37
|
+
else
|
|
38
|
+
echo "✗ catalog validation failed"; exit 1
|
|
39
|
+
fi
|
|
@@ -7,16 +7,16 @@ Find every place a single truth lives, name its rightful home, and report the dr
|
|
|
7
7
|
|
|
8
8
|
## Goal
|
|
9
9
|
|
|
10
|
-
Locate Single-Source-of-Truth (SSOT) violations: one fact duplicated, paraphrased, or contradicted across artifacts or platforms. A fact with N copies carries N-1 liabilities, because copies drift out of sync. The output is a map — where it lives, which copy should be canonical, and what to do with the rest — that
|
|
10
|
+
Locate Single-Source-of-Truth (SSOT) violations: one fact duplicated, paraphrased, or contradicted across artifacts or platforms. A fact with N copies carries N-1 liabilities, because copies drift out of sync. The output is a map — where it lives, which copy should be canonical, and what to do with the rest — that `ssotize` or a human can act on. This is read-only.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
A different vector from `re0` (depth, one artifact); once a fact is cleanly SSOT'd, keep it tidy with `re0`. Reach for SSOT when establishing order.
|
|
13
13
|
|
|
14
14
|
## Workflow
|
|
15
15
|
|
|
16
16
|
1. Name the truth in scope — the specific fact, value, spec, decision, status, or definition being tracked, not the whole document.
|
|
17
17
|
2. Enumerate every occurrence across the given artifacts and platforms.
|
|
18
18
|
3. Classify each occurrence: exact copy, paraphrase, partial, stale, or contradictory.
|
|
19
|
-
4. Pick the canonical home — the most authoritative and most-maintained location, closest to where the fact actually changes (the code/config for a value, the spec for a decision, the ticket for status).
|
|
19
|
+
4. Pick the canonical home — the most authoritative and most-maintained location, closest to where the fact actually changes (the code/config for a value, the spec for a decision, the ticket for status); never arbitrarily.
|
|
20
20
|
5. Decide the action per non-canonical occurrence: **dedupe** (redundant copy), **reference** (should link to canonical), or **reconcile** (it disagrees — needs a human call on which is right).
|
|
21
21
|
6. Report: a table of occurrences (location · kind · action), the proposed canonical home with a one-line justification, and a separate list of contradictions/drift that need a decision.
|
|
22
22
|
|
|
@@ -24,7 +24,6 @@ Locate Single-Source-of-Truth (SSOT) violations: one fact duplicated, paraphrase
|
|
|
24
24
|
|
|
25
25
|
- Read-only. Propose; do not edit, move, or delete.
|
|
26
26
|
- An empty findings list is a valid result — never invent drift to fill the report.
|
|
27
|
-
- Justify the canonical choice by authority, proximity-to-change, and freshness — never pick arbitrarily.
|
|
28
27
|
- Keep contradictions separate from plain duplicates; never silently decide which conflicting value is "true".
|
|
29
28
|
- Flag any detail that lives ONLY in a non-canonical copy — it must be folded into the canonical home before that copy can be cut.
|
|
30
29
|
- Respect boundaries: surface (don't ignore) when copies span trust/permission scopes — private vs public, internal vs customer-facing.
|
|
@@ -34,7 +33,6 @@ Locate Single-Source-of-Truth (SSOT) violations: one fact duplicated, paraphrase
|
|
|
34
33
|
|
|
35
34
|
Before finishing:
|
|
36
35
|
|
|
37
|
-
1.
|
|
36
|
+
1. Re-enumerate by a second method — a different search term, synonym, or tool — and confirm it surfaces no occurrence the report missed. Completeness is the core SSOT risk: a copy you never found is a copy that will drift.
|
|
38
37
|
2. The canonical home is justified, not assumed.
|
|
39
|
-
3.
|
|
40
|
-
4. The report is actionable: a human or `/ssotize` could execute it without re-discovering anything.
|
|
38
|
+
3. The report is actionable: a human or `ssotize` could execute it without re-discovering anything.
|
|
@@ -9,26 +9,21 @@ Collapse a scattered truth into one canonical home; make every other place point
|
|
|
9
9
|
|
|
10
10
|
Enforce Single Source of Truth (SSOT): one fact = one home, and every other place that needs it references that home instead of copying it. References don't drift; copies do. This mutates artifacts, so it is deliberate and loss-averse.
|
|
11
11
|
|
|
12
|
-
Use this to **establish or repair** SSOT — messy, legacy, or freshly-scaffolded states.
|
|
12
|
+
Use this to **establish or repair** SSOT — messy, legacy, or freshly-scaffolded states. Once SSOT holds, don't overuse `ssotize`: maintain artifacts with `re0` instead. (See `ssotchk` for how the SSOT vector differs from `re0`.)
|
|
13
13
|
|
|
14
14
|
## Workflow
|
|
15
15
|
|
|
16
|
-
1. Audit first — run the
|
|
16
|
+
1. Audit first — run the `ssotchk` workflow (or reuse its result) for the canonical home and the per-occurrence action plan. Don't consolidate blind.
|
|
17
17
|
2. Make the canonical home complete and current — fold in any unique detail that lived only in a copy. Never lose information to consolidation.
|
|
18
18
|
3. Reconcile contradictions in the canonical home FIRST (confirm the correct value with the human when ambiguous); only then point others at it.
|
|
19
19
|
4. Replace each duplicate with a reference to the canonical home — a link, a "see <home>", a quote-with-link, or a transclude where the platform supports it.
|
|
20
20
|
5. Remove the now-redundant copies. Where removal would orphan a reader, leave a one-line pointer instead of deleting outright.
|
|
21
|
-
6. Re-read the canonical home: it must now carry the whole truth on its own.
|
|
22
21
|
|
|
23
22
|
## Rules
|
|
24
23
|
|
|
25
24
|
- A pass that finds no scatter to consolidate changes nothing.
|
|
26
|
-
- Fold before you cut — never delete the only place a detail exists.
|
|
27
|
-
- One canonical home per fact; prefer a reference over a copy everywhere else.
|
|
28
|
-
- Reconcile, don't duplicate, contradictions — resolve the conflicting value in one place, never preserve it in two.
|
|
29
25
|
- Don't consolidate across a trust/permission boundary (private → public, customer-facing → internal) without explicit confirmation.
|
|
30
|
-
- Be platform-aware: transclude where possible, else link to a stable anchor;
|
|
31
|
-
- Keep it reversible: prefer a reference over a hard deletion when a platform can't link back.
|
|
26
|
+
- Be platform-aware: transclude where possible, else link to a stable anchor the reader can follow; prefer a reference over a hard deletion when a platform can't link back.
|
|
32
27
|
|
|
33
28
|
## Verification
|
|
34
29
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: factchk
|
|
3
|
+
description: "Verify reality-grounded claims against external sources in both directions before they ship — could the 'absurd' be real, could the 'obvious' be false or long-established? Use whenever an artifact, or the sentence you are about to write, asserts something as plausible, realistic, absurd, novel, or impossible from intuition rather than a checked source; before relying on a factual claim in prose, a design rationale, a research claim, or a plan. Fires on metacognitive doubt — when you can't actually know, verify instead of trusting the feeling. Scans read-only, then fixes the clear errors or flags the judgment calls; leaves deliberate fiction alone."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Check what's asserted as real against reality — in both directions — before it ships.
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
The author's "plausible / absurd / novel" is the least reliable line in any artifact. Human priors fail **both ways** — they exclude the real (desert frogs exist) and normalize the impossible (weightless crates). `factchk` scans claims presented as reality-grounded, verifies each against external sources in both directions, and fixes or flags. A claim about *the world* is `factchk`; for a validation's soundness see `mandela`, for the whole plan see `redteam`.
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. Scan for **reality-grounded assertions** — anything leaning on "this is plausible / realistic / absurd / novel / impossible because X," including the claim you are *about to write*, not only those already on the page.
|
|
15
|
+
2. Verify each against **external sources** (web search, open references) in **both directions**: could the "absurd" be real? could the "obvious" or "novel" be false or long-established? If you cannot reach a source, **flag — never assert from intuition**.
|
|
16
|
+
3. **Fix or flag:** a mechanically-clear error (a wrong date, a misattributed source, a falsified number) → correct it with a cited source; a judgment call (a contested or interpretive claim) → surface it, don't silently rewrite.
|
|
17
|
+
4. Report each claim, its verdict, the source, and — for a failed claim — which direction it failed.
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- Target claims asserted **as reality-grounded**, never deliberate fiction ("in our world, boxes float" is a declared choice). When it is unclear whether a claim is an in-world choice or a real-world assertion, **flag, don't fix** — the hardest call in the skill.
|
|
22
|
+
- Flagging only the unrealistic catches half the errors.
|
|
23
|
+
- The trigger is **metacognition, not knowledge**: you can't know every domain, so the moment you are about to assert a checkable fact from a feeling, verify it instead of trusting the feeling.
|
|
24
|
+
- A pass that finds nothing changes nothing.
|
|
25
|
+
|
|
26
|
+
## Verification
|
|
27
|
+
|
|
28
|
+
Before finishing: every verdict traces to a citable external source, not a reworded prior intuition — and the report reads as fixes-vs-flags, not restated intuitions.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mandela
|
|
3
|
+
description: "Audit any eval, metric, experiment, or benchmark for leakage — does external ground-truth enter independently, or are the model, scorer, and designer just confirming a result no outside truth ever produced? Use before trusting any 'how we'll know it worked' — an A/B, a holdout, a score, a validation — and whenever a result feels too clean or self-confirming. Walks an 8-pattern leakage taxonomy and returns only the patterns that fire, each with an independence fix. Read-only."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Audit a validation for leakage: does outside ground-truth actually enter, or is everyone confirming a result no one independently produced?
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
The name is the **Mandela Effect** — a whole population *confidently remembers* something that never independently happened; a leaky validation is the same shape. Walk the 8 patterns below. `mandela` checks whether a *validation* is independent; `factchk` checks a claim against the world, and `redteam` calls `mandela` for the leakage axis of a design.
|
|
11
|
+
|
|
12
|
+
## Workflow
|
|
13
|
+
|
|
14
|
+
1. Identify the validation (eval / metric / experiment / holdout / "how we'll know"). Name its **components** — what plays model, scorer, designer, dataset.
|
|
15
|
+
2. Ask the **core question**: does external ground-truth enter *independently*?
|
|
16
|
+
3. Test the validation against all **8 patterns** below (some apply only to certain components — a human subject, a scorer); report only the ones that fire, each by name.
|
|
17
|
+
4. Give the independent-ground-truth fix for each hit.
|
|
18
|
+
|
|
19
|
+
## The 8 leakage patterns
|
|
20
|
+
|
|
21
|
+
1. **Recall, not reason** — a memorized answer recited instead of one actually derived; the system already knows the result it is supposedly computing.
|
|
22
|
+
2. **Wrong null hypothesis** — an ablation that removes a surface label but not the underlying signal the system actually exploits, so the "control" still leaks.
|
|
23
|
+
3. **Shared hallucination** — two components verifying each other; circularity reported as a number.
|
|
24
|
+
4. **Tautology** — a scorer grading buckets it drew itself.
|
|
25
|
+
5. **Verifier = designer** — a private, unreproducible recipe in a holdout's clothes.
|
|
26
|
+
6. **Shared-pool bias** — train and holdout drawn from one labeler pool, so one bias enters both sides.
|
|
27
|
+
7. **Frame injection** — a question that hands the subject the hypothesis.
|
|
28
|
+
8. **Demand characteristics** — measured subjects who know they're being measured.
|
|
29
|
+
|
|
30
|
+
## Rules
|
|
31
|
+
|
|
32
|
+
- Subtlety that bites twice: you can blind the **output value** and still leak the **collection recipe**.
|
|
33
|
+
- Read-only — name the leak and the independence fix; don't rewrite the experiment.
|
|
34
|
+
|
|
35
|
+
## Verification
|
|
36
|
+
|
|
37
|
+
Turn mandela on this audit:
|
|
38
|
+
|
|
39
|
+
1. Run patterns #3–#5 on yourself: are you a scorer grading buckets you drew (Tautology, #4)? is the verifier the designer (#5)? is your verdict a shared hallucination with the design's own claims (#3)?
|
|
40
|
+
2. Could a reader who didn't run the audit reach your verdict from the cited evidence alone — independent ground-truth?
|
|
41
|
+
3. The report names the root, not a laundry list.
|
|
@@ -7,9 +7,6 @@ Refresh the target artifact as if it were the first clean version.
|
|
|
7
7
|
|
|
8
8
|
## Goal
|
|
9
9
|
|
|
10
|
-
Use this when the user asks to clean up, sync up, dedupe, or rewrite an existing
|
|
11
|
-
artifact into the current best v0.
|
|
12
|
-
|
|
13
10
|
The result must be lighter, more current, and more accurate than the input. It
|
|
14
11
|
should not read like a changelog, cleanup note, or patch over an older draft.
|
|
15
12
|
|
|
@@ -32,13 +29,12 @@ should not read like a changelog, cleanup note, or patch over an older draft.
|
|
|
32
29
|
- Convert "what changed" into "what is true now".
|
|
33
30
|
- Keep only details that improve future execution, accuracy, or recall.
|
|
34
31
|
- Do not leave old/new traces unless the artifact is explicitly a changelog.
|
|
32
|
+
- Fix machine-clear residue; surface judgment calls — never auto-resolve an ambiguity or "fix" a deliberate look-alike.
|
|
33
|
+
- Repair from the source of truth — the canonical or sibling artifact, not the damaged surface — and mutate per the edit-safety convention (CLAUDE.md): never a blanket positional sweep.
|
|
35
34
|
- Do not create extra files unless the user asks.
|
|
36
35
|
|
|
37
36
|
## Verification
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
2. Confirm related artifacts still point in the same direction.
|
|
43
|
-
3. Confirm the output is smaller or cleaner unless the user explicitly wanted expansion.
|
|
44
|
-
4. Report what noise was removed and what durable truth was kept.
|
|
38
|
+
The result reads as a clean v0 to fresh eyes — no trace of the older draft, no
|
|
39
|
+
sign it was patched rather than rewritten (defer to `shower` if unsure). Report
|
|
40
|
+
what noise was removed and what durable truth was kept.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: re0-git
|
|
3
|
+
disable-model-invocation: true
|
|
4
|
+
description: "Rewrite a finished commit's message into a clean, handoff-ready form in your own log style, so `git log` alone tells the story. User-invoked: run it after a commit."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
`re0` for git: rewrite a finished commit message so the log hands off on its own — in the author's own voice, not an imposed one.
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Repeated amends and momentum commits leave a message bloated, stale, or padded with trivia. `re0-git` applies `re0` to the message: a clean version that lets a fresh session continue from `git log` alone, without reading the diff. It refines what the author already writes. Only the message moves — and timestamps, per the date rule below; the tree never changes.
|
|
12
|
+
|
|
13
|
+
It is **user-invoked** (see docs/invocation.md) — run it once you've decided to commit. A commit-cleanup tool in the agent's reach would bias it toward committing when it shouldn't.
|
|
14
|
+
|
|
15
|
+
## Workflow
|
|
16
|
+
|
|
17
|
+
1. Scope the target — usually `HEAD`, sometimes a short unpushed range.
|
|
18
|
+
2. Read the change (`git show --stat`, `git diff`) and any documented commit rules. Then sample nearby non-target messages: start with 10, stop earlier if the convention is obvious, or expand only until the convention is clear.
|
|
19
|
+
3. Resolve mixed logs in this order: documented project rules, nearby commits touching the same area, then same-author commits within that convention. Do not average incompatible styles or let one author's habits override the repo.
|
|
20
|
+
4. Rewrite the message in that style, keeping only durable handoff facts. Cut stale lines, motives already documented elsewhere, file lists, registration details, version/tag/package bumps, and any fact the diff or tag already proves. Fold supporting edits into the real change they serve; do not give trivia its own bullet.
|
|
21
|
+
5. Re-commit signed, dates per the rule below. For the tip (`HEAD`): `git commit --amend -S`. For an older commit, keeping its dates: rebuild it — `GIT_AUTHOR_DATE`/`GIT_COMMITTER_DATE git commit-tree <tree> -p <parent> -S -m "<new message>"` — then replay every descendant onto the rebuilt commit (a non-tip rewrite is a rebase, not a ref move), or you orphan them.
|
|
22
|
+
6. Verify and report.
|
|
23
|
+
|
|
24
|
+
## Rules
|
|
25
|
+
|
|
26
|
+
- **Never create or suggest a commit** — re0-git only rewrites the message of a commit that already exists. Using it is never a reason to commit.
|
|
27
|
+
- **Message only** — the tree must stay byte-identical (`git diff <old> <new>` empty); never edit content in a re0-git pass.
|
|
28
|
+
- **Match the local message economy** — mirror the nearby log's density as well as its shape: subject style, body/no-body choice, bullet style, punctuation, and what it leaves unsaid.
|
|
29
|
+
- **In shared repos, match the repo before the person** — author voice matters only inside the repository's convention.
|
|
30
|
+
- **Keep the essence, cut the trivia** — leave only what a fresh session needs to know next. Do not mention versions, tags, package metadata, file moves, generated artifacts, or validation plumbing unless they are the actual product change.
|
|
31
|
+
- **Dates by position; always gpg-signed.** The commit you're finalizing — `HEAD` — takes both author and committer date = now, because re-cleaning the latest commit is itself continued work. Every older commit (`HEAD~1` and back) keeps its original author + committer dates; never restamp the past.
|
|
32
|
+
- **Never rewrite pushed or shared history** without explicit confirmation — it forces a force-push.
|
|
33
|
+
|
|
34
|
+
## Verification
|
|
35
|
+
|
|
36
|
+
1. `git diff <old-tip> <new-tip>` is empty — content unchanged.
|
|
37
|
+
2. Each rewritten commit is gpg-signed (`%G?` = `G`) with dates as intended.
|
|
38
|
+
3. Re-read `git log` alone, diff hidden — if any cut line turns out to be needed to follow the change, restore it.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: redteam
|
|
3
|
+
disable-model-invocation: true
|
|
4
|
+
description: "Adversarially try to KILL a plan, design, or argument before you commit to it — return the single load-bearing flaw and the cheapest experiment that would falsify it (the 'first nail'), not a checklist. Run it yourself when you're about to spend real effort on something; user-invoked on purpose, never auto-fired, because a kill-it reflex always in the agent's reach would bias it toward demolition. Composes factchk and mandela for the fact and leakage axes; it owns the synthesis to one root."
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Try to kill the artifact, not improve it — return the one root flaw and the cheapest shot that fells it.
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Where `shower` asks "can a stranger follow this?" (comprehension), `redteam` asks "does this survive someone trying to break it?" (validity). It is the **superset** reflex: where `factchk` checks one fact and `mandela` audits one validation, `redteam` attacks the *whole* plan and collapses it to a single root. The highest-value output is never a checklist — it's one root cause plus the cheaper experiment hiding inside the elaborate plan.
|
|
12
|
+
|
|
13
|
+
## Workflow
|
|
14
|
+
|
|
15
|
+
1. Pin the **load-bearing assumption(s)** — what must hold for the whole thing to stand.
|
|
16
|
+
2. Attack on whatever axes apply — the general ones first: **a load-bearing fact** that may be false (run `factchk`), **confabulation** (a post-hoc story treated as ground truth), **analogy-mistaken-for-isomorphism** (structure assumed to transfer across domains where it doesn't), **future-tense suture** (the argument leans on a result that doesn't exist yet), and the sharpest — **cites a principle but implements its opposite**; and for empirical / research plans, **leakage** (run `mandela`) and **statistical power / family-wise α** (a true hypothesis auto-failing from uncorrected tests; a near-zero-power condition that rubber-stamps regardless of truth).
|
|
17
|
+
3. Collapse the findings to the **single root** cause — the one whose failure makes the others moot.
|
|
18
|
+
4. Find the **first nail** — the cheapest falsification of the load-bearing assumption: the check (in time / cost / sample) that could kill it *before* the expensive program runs.
|
|
19
|
+
5. Return `{ root, first_nail }` — not a list.
|
|
20
|
+
|
|
21
|
+
## Rules
|
|
22
|
+
|
|
23
|
+
- **Kill, don't improve** — improving is a different reflex.
|
|
24
|
+
- Compose, don't duplicate — invoke `factchk` and `mandela` for their axes; you own the synthesis to one root.
|
|
25
|
+
|
|
26
|
+
## Verification
|
|
27
|
+
|
|
28
|
+
Before finishing:
|
|
29
|
+
|
|
30
|
+
1. The root is genuinely load-bearing — the plan falls without it.
|
|
31
|
+
2. The first nail is genuinely cheaper than the plan it would pre-empt.
|
|
@@ -16,22 +16,21 @@ A long session quietly accumulates context you can't un-see, so you lose the abi
|
|
|
16
16
|
3. Have it cold-read blind and report, from the artifact alone:
|
|
17
17
|
- what it takes the artifact to be, do, and expect;
|
|
18
18
|
- what is unclear, ambiguous, or assumed-but-unstated;
|
|
19
|
-
- what it would need to act confidently, and what it had to guess
|
|
19
|
+
- what it would need to act confidently, and what it had to guess.
|
|
20
20
|
4. Compare its blind understanding against the intent you noted in step 1 (which it never saw). Every mismatch is a defect in the artifact, not a reader error.
|
|
21
21
|
5. Report the defects and concrete fixes, ordered by how badly each blocks a fresh reader.
|
|
22
22
|
|
|
23
23
|
## Rules
|
|
24
24
|
|
|
25
25
|
- The read MUST come from a separate, context-free sub-session — never self-assess in this session, because you can't un-see the context (that is the whole point).
|
|
26
|
-
-
|
|
26
|
+
- Pass the artifact's contents, never your intent.
|
|
27
27
|
- A forced "I had to assume…" is a finding, not a reader failure.
|
|
28
28
|
- Medium-agnostic: adapt the cold-read questions to what the artifact is.
|
|
29
|
-
-
|
|
29
|
+
- **Read, don't sweep.** The cold-read is an end-to-end read, not a pattern-grep — a sweep catches only known patterns and misses stale refs, dead links, fact drift, and silent edit-damage. Track how much was actually read; never report "clean" from a grep alone.
|
|
30
30
|
|
|
31
31
|
## Verification
|
|
32
32
|
|
|
33
33
|
Before finishing:
|
|
34
34
|
|
|
35
35
|
1. The read came from a fresh sub-session blind to your intent.
|
|
36
|
-
2.
|
|
37
|
-
3. Report the verdict (stands on its own / needs work) and hand the fixes to the main session.
|
|
36
|
+
2. Report the verdict (stands on its own / minor gaps / needs work) and hand the fixes to the main session.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
3
|
-
description: "After you create or change an artifact or skill, taste-test it with our own skills instead of trusting your in-session judgment — recursive self-improvement, made automatic. Use right after writing or editing anything, before calling it done, committing, or handing it off
|
|
2
|
+
name: sip
|
|
3
|
+
description: "After you create or change an artifact or skill, taste-test it with our own skills instead of trusting your in-session judgment — recursive self-improvement, made automatic. Use right after writing or editing anything, before calling it done, committing, or handing it off."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Taste your own cooking: the moment you finish making something, check it with the very skills this repo ships before you serve it.
|
|
7
7
|
|
|
8
8
|
## Goal
|
|
9
9
|
|
|
10
|
-
A reminder buried in docs ("remember to verify") won't reliably fire in a fresh session. `
|
|
10
|
+
A reminder buried in docs ("remember to verify") won't reliably fire in a fresh session. `sip` makes the recursive self-improvement loop a triggered habit: right after any create or change, run our own skills on the result so quality doesn't ride on the author's biased in-session judgment.
|
|
11
11
|
|
|
12
12
|
## Workflow
|
|
13
13
|
|
|
@@ -20,10 +20,9 @@ A reminder buried in docs ("remember to verify") won't reliably fire in a fresh
|
|
|
20
20
|
## Rules
|
|
21
21
|
|
|
22
22
|
- Trigger on your OWN output, right after making it — that's when bias is highest and a check is cheapest.
|
|
23
|
-
- Use the skills; don't re-implement them (`shower` for clarity, `ssotchk`/`ssotize` for SSOT, `re0` for cleanup).
|
|
23
|
+
- Use the skills; don't re-implement them (`shower` for clarity, `ssotchk`/`ssotize` for SSOT, `re0` for cleanup) — `sip` orchestrates and routes findings back to the author session to fix; the skills do the work.
|
|
24
24
|
- Skip what plainly doesn't apply (a one-line change may need only `ssotchk`), but say what you skipped and why.
|
|
25
|
-
-
|
|
26
|
-
- Stop at the artifact — `tasting` never touches git or makes commits. Cleaning a commit's message is a separate, user-invoked step (`re0-git`), and `tasting` must not chain to it.
|
|
25
|
+
- Stop at the artifact — `sip` never touches git or makes commits. Cleaning a commit's message is a separate, user-invoked step (`re0-git`), and `sip` must not chain to it.
|
|
27
26
|
|
|
28
27
|
## Verification
|
|
29
28
|
|
|
@@ -31,4 +30,4 @@ Before finishing:
|
|
|
31
30
|
|
|
32
31
|
1. The change was actually run through the relevant skills, not eyeballed.
|
|
33
32
|
2. Findings were applied (or consciously deferred with a stated reason).
|
|
34
|
-
3. The
|
|
33
|
+
3. The artifact actually changed as a result (a diff exists), or every skipped skill has a stated reason.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: re0-git
|
|
3
|
-
disable-model-invocation: true
|
|
4
|
-
description: "Rewrite a finished commit's message into a clean, handoff-ready form — in your own log style — so `git log` alone tells the story, no `git diff` archaeology next session. Run it yourself after a commit (user-invoked on purpose, never auto-fired). Message only: never the tree, always gpg-signed; the commit you finalize takes fresh dates, older commits keep theirs."
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
`re0` for git: rewrite a finished commit's message so the log hands off on its own — in the author's own voice, not an imposed one.
|
|
8
|
-
|
|
9
|
-
## Goal
|
|
10
|
-
|
|
11
|
-
Repeated amends and momentum-commits leave a message bloated, stale, or padded with trivia. `re0-git` applies `re0` to the message: a clean version that lets a fresh session continue from `git log` alone, without reading the diff. It refines *what the author already writes* — it never imposes a format, and it never makes a commit. Only the message moves — and timestamps, per the date rule below; the tree never changes.
|
|
12
|
-
|
|
13
|
-
It is **user-invoked** — you run it once you've decided to commit. Deliberately not model-invoked and not chained from `tasting`: a commit-cleanup tool sitting in the agent's reach would bias it toward committing when it shouldn't, so it's kept out of that reach entirely.
|
|
14
|
-
|
|
15
|
-
## Workflow
|
|
16
|
-
|
|
17
|
-
1. Scope the target — usually `HEAD`, sometimes a short unpushed range. A commit must already exist; re0-git never creates one.
|
|
18
|
-
2. Read two things: what actually changed (`git show --stat`, `git diff`) so the message is true, and the author's recent `git log` so you match how they write — a one-line head, or a subject with bullets, terse or prose, whatever it is.
|
|
19
|
-
3. Rewrite the message in that style, keeping only what carries the change for a handoff. Cut the rest: stale or half-true lines, context or principles already documented elsewhere, and mechanical or derivable trivia (version bumps, file registration, platform or scope enumerations, "also updated X"). One point per real change — fold a minor change into a related point instead of giving it its own line; never pad to a length.
|
|
20
|
-
4. Re-commit signed, with dates per the rule below: for the tip you're finalizing (`HEAD`), a plain `git commit --amend -S` lets both dates default to now; to keep an older commit's dates, rebuild it with `GIT_AUTHOR_DATE`/`GIT_COMMITTER_DATE git commit-tree <tree> -p <parent> -S` and move the branch ref. For a range, the tip restamps and the rest preserve.
|
|
21
|
-
5. Verify and report.
|
|
22
|
-
|
|
23
|
-
## Rules
|
|
24
|
-
|
|
25
|
-
- **Never create or suggest a commit** — re0-git only rewrites the message of a commit that already exists. Using it is never a reason to commit.
|
|
26
|
-
- **Message only** — the tree must stay byte-identical (`git diff <old> <new>` empty); never edit content in a re0-git pass.
|
|
27
|
-
- **Match the author's style, don't impose one** — no mandated convention, structure, tone, or emoji. Mirror their existing log; a one-line head stays a one-line head.
|
|
28
|
-
- **Keep the essence, cut the trivia** — leave only what a fresh session needs to hand off from the log; no padding, no mechanical or derivable noise. The log is the single source of truth for the change.
|
|
29
|
-
- **Dates by position; always gpg-signed.** The commit you're finalizing — `HEAD` — takes both author and committer date = now, because re-cleaning the latest commit is itself continued work. Every older commit (`HEAD~1` and back) keeps its original author + committer dates; never restamp the past.
|
|
30
|
-
- **Never rewrite pushed or shared history** without explicit confirmation — it forces a force-push.
|
|
31
|
-
|
|
32
|
-
## Verification
|
|
33
|
-
|
|
34
|
-
1. `git diff <old-tip> <new-tip>` is empty — content unchanged.
|
|
35
|
-
2. Each rewritten commit is gpg-signed (`%G?` = `G`) with dates as intended.
|
|
36
|
-
3. `git log` reads clean in the author's own style and is enough for handoff on its own.
|