paperthin 0.6.0 → 0.7.1
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 +6 -2
- package/.github/workflows/release.yml +6 -1
- package/CLAUDE.md +21 -7
- package/README.md +18 -3
- package/assets/map.svg +90 -40
- package/package.json +2 -2
- package/skills/coil/flywheel/SKILL.md +55 -0
- package/skills/coil/nba/SKILL.md +49 -0
- package/skills/coil/retro/SKILL.md +52 -0
- package/skills/coil/scratch/SKILL.md +47 -0
- package/skills/depth/factchk/SKILL.md +1 -1
- package/skills/depth/{redteam → hate}/SKILL.md +6 -6
- package/skills/depth/mandela/SKILL.md +1 -1
|
@@ -6,10 +6,14 @@
|
|
|
6
6
|
"./skills/depth/mandela",
|
|
7
7
|
"./skills/depth/re0",
|
|
8
8
|
"./skills/depth/re0-git",
|
|
9
|
-
"./skills/depth/
|
|
9
|
+
"./skills/depth/hate",
|
|
10
10
|
"./skills/depth/shower",
|
|
11
11
|
"./skills/depth/sip",
|
|
12
12
|
"./skills/breadth/ssotchk",
|
|
13
|
-
"./skills/breadth/ssotize"
|
|
13
|
+
"./skills/breadth/ssotize",
|
|
14
|
+
"./skills/coil/retro",
|
|
15
|
+
"./skills/coil/scratch",
|
|
16
|
+
"./skills/coil/flywheel",
|
|
17
|
+
"./skills/coil/nba"
|
|
14
18
|
]
|
|
15
19
|
}
|
|
@@ -13,6 +13,8 @@ jobs:
|
|
|
13
13
|
runs-on: ubuntu-latest
|
|
14
14
|
steps:
|
|
15
15
|
- uses: actions/checkout@v4
|
|
16
|
+
with:
|
|
17
|
+
fetch-depth: 0 # fetch the annotated tag's message for the release notes
|
|
16
18
|
|
|
17
19
|
- uses: actions/setup-node@v4
|
|
18
20
|
with:
|
|
@@ -36,4 +38,7 @@ jobs:
|
|
|
36
38
|
- name: Create the GitHub Release
|
|
37
39
|
env:
|
|
38
40
|
GH_TOKEN: ${{ github.token }}
|
|
39
|
-
run:
|
|
41
|
+
run: |
|
|
42
|
+
git tag -l --format='%(contents)' "$GITHUB_REF_NAME" \
|
|
43
|
+
| sed '/-----BEGIN PGP SIGNATURE-----/,/-----END PGP SIGNATURE-----/d' > "$RUNNER_TEMP/notes.md"
|
|
44
|
+
gh release create "$GITHUB_REF_NAME" --title "PaperThin ${GITHUB_REF_NAME#v}" --notes-file "$RUNNER_TEMP/notes.md"
|
package/CLAUDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# PaperThin
|
|
2
2
|
|
|
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`, `
|
|
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`, `hate`, … — is defined in the shipped catalog, the [README](./README.md).
|
|
4
4
|
|
|
5
5
|
## Philosophy
|
|
6
6
|
|
|
@@ -19,10 +19,24 @@ Topic domains belong in separate plugins, so within a plugin the only durable cu
|
|
|
19
19
|
|
|
20
20
|
That cut is two orthogonal axes, **cardinality × time**:
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
```text
|
|
23
|
+
skills/
|
|
24
|
+
├── depth/ one artifact · now
|
|
25
|
+
│ refine or verify the thing in hand
|
|
26
|
+
│ re0 · re0-git · shower · sip · factchk · mandela · hate
|
|
27
|
+
│
|
|
28
|
+
├── breadth/ many artifacts · now
|
|
29
|
+
│ reconcile one truth across files and platforms
|
|
30
|
+
│ ssotchk · ssotize
|
|
31
|
+
│
|
|
32
|
+
├── coil/ one project · across iterations
|
|
33
|
+
│ carry learning between build cycles
|
|
34
|
+
│ retro · scratch · flywheel · nba
|
|
35
|
+
│
|
|
36
|
+
└── mesh/ many minds · across rounds
|
|
37
|
+
converge independent views into consensus
|
|
38
|
+
(reserved · v0.8)
|
|
39
|
+
```
|
|
26
40
|
|
|
27
41
|
**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
42
|
|
|
@@ -51,13 +65,13 @@ description: "<trigger-rich one-liner>"
|
|
|
51
65
|
|
|
52
66
|
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).
|
|
53
67
|
|
|
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 `
|
|
68
|
+
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 `hate` (a hate-it reflex always in the agent's reach would bias it toward demolition).
|
|
55
69
|
|
|
56
70
|
## Conventions
|
|
57
71
|
|
|
58
72
|
Shared rules a skill references rather than restates:
|
|
59
73
|
|
|
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.
|
|
74
|
+
- **edit-safety** (any mutating skill — `re0`, `ssotize`, `scratch`): 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
75
|
- **negatives-as-corpus**: "cut" means **move-to-archive, never delete** — pruned and failed branches are assets, not waste.
|
|
62
76
|
|
|
63
77
|
## Shipping
|
package/README.md
CHANGED
|
@@ -34,13 +34,17 @@ Plain-Markdown skills that turn old engineering wisdom into reflexes your agent
|
|
|
34
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
35
|
| 🔎 **[ssotchk](./skills/breadth/ssotchk/SKILL.md)** | many artifacts | Find where one fact is scattered or duplicated; name the canonical source *(read-only)* |
|
|
36
36
|
| 🧲 **[ssotize](./skills/breadth/ssotize/SKILL.md)** | many artifacts | Consolidate it into one home and point the rest at it |
|
|
37
|
+
| 🧭 **[retro](./skills/coil/retro/SKILL.md)** | one project, across iterations | Extract lessons, anti-patterns, gates, and vocabulary from a finished or failed cycle |
|
|
38
|
+
| 🧱 **[scratch](./skills/coil/scratch/SKILL.md)** | one project, across iterations | Restart from v0 while preserving only proven lessons, contracts, gates, and negative corpus |
|
|
39
|
+
| 🌀 **[flywheel](./skills/coil/flywheel/SKILL.md)** | one project, across iterations | Run build → QA → retro → scratch cycles without mistaking code accumulation for learning |
|
|
40
|
+
| 🎯 **[nba](./skills/coil/nba/SKILL.md)** | one project, across iterations | Read the live cycle state and return the single next best action, not a menu *(read-only)* |
|
|
37
41
|
| 🥄 **[sip](./skills/depth/sip/SKILL.md)** | your output | After any change, auto-runs `shower` + `ssotchk` + `re0` on it |
|
|
38
42
|
|
|
39
43
|
### User-invoked — you run these yourself
|
|
40
44
|
| Skill | Scope | What it does |
|
|
41
45
|
|---|---|---|
|
|
42
46
|
| 🧾 **[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
|
-
|
|
|
47
|
+
| 😈 **[hate](./skills/depth/hate/SKILL.md)** | one plan | Refuse to be nice to it — the one objection that could kill it + the cheapest test |
|
|
44
48
|
|
|
45
49
|
## The Map
|
|
46
50
|
|
|
@@ -66,6 +70,7 @@ These skills bet the other way — **every one of them removes:**
|
|
|
66
70
|
- `re0` rewrites a draft into a clean v0 instead of patching it,
|
|
67
71
|
- `ssotchk` / `ssotize` collapse the same fact scattered across files,
|
|
68
72
|
- `shower` cuts whatever a stranger can't follow,
|
|
73
|
+
- `retro` / `scratch` preserve the lesson and let the wrong build die,
|
|
69
74
|
- `sip` runs all of it on your own output, automatically.
|
|
70
75
|
|
|
71
76
|
> [!TIP]
|
|
@@ -167,9 +172,19 @@ A model, a scorer, and a designer can all agree a result is real while no outsid
|
|
|
167
172
|
### #8 — You can't kill your own plan
|
|
168
173
|
You built it, so you defend it. The questions that would break it are exactly the ones you won't ask.
|
|
169
174
|
|
|
170
|
-
**The fix → `
|
|
175
|
+
**The fix → `hate`:** refuse to be nice to the plan — return the one load-bearing objection that could kill it and the cheapest experiment that would prove it matters. User-invoked: you point it at a plan deliberately.
|
|
171
176
|
|
|
172
|
-
> *Prior art: [egoless programming](https://en.wikipedia.org/wiki/Egoless_programming) (Weinberg, 1971 — the same root `shower` cites),
|
|
177
|
+
> *Prior art: [egoless programming](https://en.wikipedia.org/wiki/Egoless_programming) (Weinberg, 1971 — the same root `shower` cites), hostile review, and fail-fast.*
|
|
178
|
+
|
|
179
|
+
### #9 — A build can run and still be wrong
|
|
180
|
+
Long agentic builds can produce many working parts while missing the product: panels, routes, screenshots, and tests that prove activity more than value. The mistake is carrying that architecture forward because it cost effort.
|
|
181
|
+
|
|
182
|
+
**The fix → `retro` + `scratch`:** extract the lesson, anti-pattern, vocabulary, and next gate, then restart from a clean v0 when the foundation is wrong. Keep only what earned reuse.
|
|
183
|
+
|
|
184
|
+
### #10 — Iterations can spin without learning
|
|
185
|
+
After a disappointing pass, the next move can blur into a dozen plausible threads: patch, rebuild, test more, write docs, add features. That is how projects accumulate surfaces instead of compounding.
|
|
186
|
+
|
|
187
|
+
**The fix → `flywheel` + `nba`:** run the build → QA → retro → scratch loop, and when the thread is lost, read the state and return one next best action with a clear done-when.
|
|
173
188
|
|
|
174
189
|
## Credits
|
|
175
190
|
|
package/assets/map.svg
CHANGED
|
@@ -1,53 +1,103 @@
|
|
|
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:
|
|
2
|
-
<
|
|
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: an old-paper four-quadrant graph. Horizontal axis cardinality moves from one to many; vertical axis time moves from now to across iterations. Depth is one artifact now, breadth is many artifacts now, coil is one project across iterations, and mesh is many minds across rounds.">
|
|
2
|
+
<defs>
|
|
3
|
+
<filter id="paper-grain" x="-10%" y="-10%" width="120%" height="120%">
|
|
4
|
+
<feTurbulence type="fractalNoise" baseFrequency="0.82" numOctaves="4" seed="23" result="noise"/>
|
|
5
|
+
<feColorMatrix in="noise" type="matrix" values="0.32 0 0 0 0.58 0 0.28 0 0 0.51 0 0 0.22 0 0.38 0 0 0 0.16 0" result="warmNoise"/>
|
|
6
|
+
<feBlend in="SourceGraphic" in2="warmNoise" mode="multiply"/>
|
|
7
|
+
</filter>
|
|
3
8
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
<pattern id="small-grid" width="20" height="20" patternUnits="userSpaceOnUse">
|
|
10
|
+
<path d="M 20 0 H 0 V 20" fill="none" stroke="#9FB0B7" stroke-width="0.65" opacity="0.32"/>
|
|
11
|
+
</pattern>
|
|
7
12
|
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
<pattern id="large-grid" width="100" height="100" patternUnits="userSpaceOnUse">
|
|
14
|
+
<rect width="100" height="100" fill="url(#small-grid)"/>
|
|
15
|
+
<path d="M 100 0 H 0 V 100" fill="none" stroke="#758890" stroke-width="1" opacity="0.34"/>
|
|
16
|
+
</pattern>
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
<marker id="arrow" viewBox="0 0 10 10" refX="8.5" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse">
|
|
19
|
+
<path d="M 0 0 L 10 5 L 0 10 z" fill="#2D2A24"/>
|
|
20
|
+
</marker>
|
|
21
|
+
</defs>
|
|
22
|
+
|
|
23
|
+
<rect width="1080" height="740" fill="#E7D9B8"/>
|
|
24
|
+
<rect x="38" y="28" width="1004" height="684" rx="2" fill="#F4E8C8" filter="url(#paper-grain)"/>
|
|
25
|
+
<rect x="38" y="28" width="1004" height="684" rx="2" fill="none" stroke="#B9A778" stroke-width="1.2"/>
|
|
26
|
+
|
|
27
|
+
<!-- notebook stains and deckled age marks -->
|
|
28
|
+
<path d="M 74 70 C 178 48, 246 64, 346 48 C 480 27, 607 48, 738 40 C 844 34, 942 45, 1010 70" fill="none" stroke="#C8B47A" stroke-width="3" opacity="0.16"/>
|
|
29
|
+
<path d="M 58 656 C 189 682, 330 650, 474 674 C 596 694, 733 661, 881 680 C 944 688, 997 676, 1025 662" fill="none" stroke="#B59663" stroke-width="4" opacity="0.12"/>
|
|
30
|
+
<circle cx="910" cy="116" r="56" fill="#B7834A" opacity="0.05"/>
|
|
31
|
+
<circle cx="188" cy="596" r="78" fill="#8B6C41" opacity="0.045"/>
|
|
32
|
+
|
|
33
|
+
<!-- red margin rule, like old graph paper -->
|
|
34
|
+
<line x1="112" y1="54" x2="112" y2="690" stroke="#B65443" stroke-width="1.4" opacity="0.52"/>
|
|
35
|
+
|
|
36
|
+
<!-- graph field -->
|
|
37
|
+
<rect x="146" y="92" width="846" height="536" fill="#F6ECCF"/>
|
|
38
|
+
<rect x="146" y="92" width="846" height="536" fill="url(#large-grid)"/>
|
|
39
|
+
<rect x="146" y="92" width="846" height="536" fill="none" stroke="#3A3328" stroke-width="1.4"/>
|
|
40
|
+
|
|
41
|
+
<!-- quadrant divider lines -->
|
|
42
|
+
<line x1="569" y1="92" x2="569" y2="628" stroke="#3A3328" stroke-width="1.1" stroke-dasharray="7 7"/>
|
|
43
|
+
<line x1="146" y1="360" x2="992" y2="360" stroke="#3A3328" stroke-width="1.1" stroke-dasharray="7 7"/>
|
|
44
|
+
|
|
45
|
+
<!-- arrowed axes -->
|
|
46
|
+
<line x1="146" y1="360" x2="1018" y2="360" stroke="#2D2A24" stroke-width="2.4" marker-end="url(#arrow)"/>
|
|
47
|
+
<line x1="569" y1="66" x2="569" y2="654" stroke="#2D2A24" stroke-width="2.4" marker-end="url(#arrow)"/>
|
|
48
|
+
<circle cx="569" cy="360" r="4.2" fill="#2D2A24"/>
|
|
49
|
+
|
|
50
|
+
<!-- axis labels -->
|
|
51
|
+
<text x="584" y="660" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#3C352A">time</text>
|
|
52
|
+
<text x="920" y="350" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#3C352A">cardinality</text>
|
|
53
|
+
<text x="356" y="656" text-anchor="middle" font-family="'Courier New',Courier,monospace" font-size="13" fill="#5C5448">one</text>
|
|
54
|
+
<text x="786" y="656" text-anchor="middle" font-family="'Courier New',Courier,monospace" font-size="13" fill="#5C5448">many</text>
|
|
55
|
+
<text x="82" y="229" font-family="'Courier New',Courier,monospace" font-size="13" fill="#5C5448">now</text>
|
|
56
|
+
<text x="64" y="492" font-family="'Courier New',Courier,monospace" font-size="13" fill="#5C5448">across</text>
|
|
57
|
+
<text x="64" y="510" font-family="'Courier New',Courier,monospace" font-size="13" fill="#5C5448">iterations</text>
|
|
58
|
+
|
|
59
|
+
<!-- title note -->
|
|
60
|
+
<text x="151" y="66" font-family="'Courier New',Courier,monospace" font-size="13" letter-spacing="1.6" fill="#6A5B42">CARDINALITY x TIME</text>
|
|
61
|
+
<text x="362" y="66" font-family="Georgia,'Times New Roman',serif" font-size="15" font-style="italic" fill="#6A5B42">four regions on one thin sheet</text>
|
|
15
62
|
|
|
16
63
|
<!-- depth -->
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
64
|
+
<g transform="translate(184 143)">
|
|
65
|
+
<text x="0" y="0" font-family="Georgia,'Times New Roman',serif" font-size="48" fill="#23211D">depth</text>
|
|
66
|
+
<line x1="0" y1="18" x2="132" y2="18" stroke="#7B3F2A" stroke-width="1.4" opacity="0.62"/>
|
|
67
|
+
<text x="0" y="52" font-family="'Courier New',Courier,monospace" font-size="16" fill="#4F493D">one artifact, now</text>
|
|
68
|
+
<text x="0" y="92" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#314C5B">is this one thing</text>
|
|
69
|
+
<text x="0" y="116" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#314C5B">clean and true?</text>
|
|
70
|
+
</g>
|
|
20
71
|
|
|
21
72
|
<!-- breadth -->
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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>
|
|
73
|
+
<g transform="translate(615 143)">
|
|
74
|
+
<text x="0" y="0" font-family="Georgia,'Times New Roman',serif" font-size="48" fill="#23211D">breadth</text>
|
|
75
|
+
<line x1="0" y1="18" x2="156" y2="18" stroke="#7B3F2A" stroke-width="1.4" opacity="0.62"/>
|
|
76
|
+
<text x="0" y="52" font-family="'Courier New',Courier,monospace" font-size="16" fill="#4F493D">many artifacts, now</text>
|
|
77
|
+
<text x="0" y="92" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#314C5B">is one truth</text>
|
|
78
|
+
<text x="0" y="116" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#314C5B">consistent everywhere?</text>
|
|
33
79
|
</g>
|
|
34
80
|
|
|
35
|
-
<!--
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
<
|
|
41
|
-
<text x="
|
|
81
|
+
<!-- coil -->
|
|
82
|
+
<g transform="translate(184 422)">
|
|
83
|
+
<text x="0" y="0" font-family="Georgia,'Times New Roman',serif" font-size="48" fill="#23211D">coil</text>
|
|
84
|
+
<line x1="0" y1="18" x2="92" y2="18" stroke="#7B3F2A" stroke-width="1.4" opacity="0.62"/>
|
|
85
|
+
<text x="0" y="52" font-family="'Courier New',Courier,monospace" font-size="15" fill="#4F493D">one project, across iterations</text>
|
|
86
|
+
<text x="0" y="92" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#314C5B">did each pass</text>
|
|
87
|
+
<text x="0" y="116" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#314C5B">teach the next?</text>
|
|
42
88
|
</g>
|
|
43
89
|
|
|
44
|
-
<!--
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
|
|
90
|
+
<!-- mesh -->
|
|
91
|
+
<g transform="translate(615 422)" opacity="0.82">
|
|
92
|
+
<text x="0" y="0" font-family="Georgia,'Times New Roman',serif" font-size="48" fill="#5B554A">mesh</text>
|
|
93
|
+
<line x1="0" y1="18" x2="104" y2="18" stroke="#7B3F2A" stroke-width="1.2" opacity="0.36"/>
|
|
94
|
+
<text x="0" y="52" font-family="'Courier New',Courier,monospace" font-size="15" fill="#6A6255">many minds, across rounds</text>
|
|
95
|
+
<text x="0" y="92" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#6B6F67">does the crowd</text>
|
|
96
|
+
<text x="0" y="116" font-family="Georgia,'Times New Roman',serif" font-size="17" font-style="italic" fill="#6B6F67">converge on truth?</text>
|
|
97
|
+
</g>
|
|
48
98
|
|
|
49
|
-
<!--
|
|
50
|
-
<
|
|
51
|
-
<
|
|
52
|
-
<
|
|
99
|
+
<!-- hand-drawn registration ticks -->
|
|
100
|
+
<path d="M 132 88 l 18 0 M 142 78 l 0 18" stroke="#493F32" stroke-width="1" opacity="0.42"/>
|
|
101
|
+
<path d="M 978 632 l 18 0 M 988 622 l 0 18" stroke="#493F32" stroke-width="1" opacity="0.42"/>
|
|
102
|
+
<path d="M 132 632 l 18 0 M 142 622 l 0 18" stroke="#493F32" stroke-width="1" opacity="0.3"/>
|
|
53
103
|
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paperthin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
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",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"verification",
|
|
17
17
|
"fact-check",
|
|
18
18
|
"leakage",
|
|
19
|
-
"
|
|
19
|
+
"adversarial-review",
|
|
20
20
|
"reasoning-hygiene",
|
|
21
21
|
"documentation",
|
|
22
22
|
"knowledge-base",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flywheel
|
|
3
|
+
description: "Run repeated build-QA-retro-scratch cycles while preserving learning and letting code die. Use for long agentic projects where progress must be measured by quality-cleared templates, reusable modules, and eliminated anti-patterns rather than hours spent or features accumulated."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Run the cycle so learning compounds and code accumulation does not masquerade as
|
|
7
|
+
progress.
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
`flywheel` keeps a project moving through repeated turns:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
FRAME -> BUILD -> DRIVE -> RETRO -> HATE -> SCRATCH -> BUILD AGAIN
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The unit of progress is not hours, files, panels, or features. It is the count of
|
|
18
|
+
quality-cleared templates, reusable platform modules, and anti-patterns eliminated
|
|
19
|
+
in later cycles.
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
1. Frame the thesis and quality gates.
|
|
24
|
+
2. Build one complete vertical slice.
|
|
25
|
+
3. Drive it through the real surface: browser for web apps, HTTP for API
|
|
26
|
+
contracts, computer-use for desktop apps, and CLI only for data-shaped
|
|
27
|
+
artifacts.
|
|
28
|
+
4. Run `retro` to extract lessons, anti-patterns, and next-cycle gates.
|
|
29
|
+
5. Decide whether the next pass iterates in place or uses `scratch`.
|
|
30
|
+
6. Kill the next plan before build: use the project's adversarial review skill or
|
|
31
|
+
a human-invoked attack when that skill is user-only.
|
|
32
|
+
7. Version only templates or modules that clear their gates.
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- Tests are supporting evidence, not the gate; every turn needs a real-surface
|
|
37
|
+
proof sized to the artifact.
|
|
38
|
+
- Do not widen before the core loop clears.
|
|
39
|
+
- Do not confuse generated variety with structural variety. If many outputs
|
|
40
|
+
converge to the same shape, the cycle failed the variety gate.
|
|
41
|
+
- Preserve negative corpus so later cycles can prove the same anti-pattern is
|
|
42
|
+
gone.
|
|
43
|
+
- Let code die. A restart that preserves the right lessons is progress.
|
|
44
|
+
- Stop a lap when no outside truth enters; add evidence before another internal
|
|
45
|
+
pass.
|
|
46
|
+
|
|
47
|
+
## Verification
|
|
48
|
+
|
|
49
|
+
Before finishing a lap:
|
|
50
|
+
|
|
51
|
+
1. The real surface was driven and evidence was captured.
|
|
52
|
+
2. The retro names at least one lesson, anti-pattern, or gate that affects the
|
|
53
|
+
next pass.
|
|
54
|
+
3. The keep/iterate/scratch decision is explicit.
|
|
55
|
+
4. Any version label belongs only to a quality-cleared template or module.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nba
|
|
3
|
+
description: "Read the live cycle state and return the single highest-leverage next best action, not a menu. Use when a project is between phases, the author asks what to do next, too many valid threads are open, or the work needs re-entry into frame, build, drive, retro, hate, scratch, or ship."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Find the next best action from state, not from vibes.
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
`nba` is the manual re-entry point for a stalled cycle. It reads the current state
|
|
11
|
+
and returns one action: the cheapest move that clears the binding constraint. It
|
|
12
|
+
does not execute the action and it does not offer a menu, because a menu recreates
|
|
13
|
+
the paralysis it exists to resolve.
|
|
14
|
+
|
|
15
|
+
## Workflow
|
|
16
|
+
|
|
17
|
+
1. Read the live cycle state: plan gates, retro anti-patterns, priority notes,
|
|
18
|
+
recent git/file changes, QA evidence, and the current workflow phase.
|
|
19
|
+
2. Locate the project in the cycle: FRAME, BUILD, DRIVE, RETRO, HATE, SCRATCH,
|
|
20
|
+
BUILD AGAIN, or SHIP.
|
|
21
|
+
3. Diagnose the blank-out cause: too many open threads, lost thread, unnamed
|
|
22
|
+
blocker, closed-loop fatigue, avoidance of the hard step, or a phase that is
|
|
23
|
+
already done.
|
|
24
|
+
4. Return one action: the cheapest move that clears the most. It may name the
|
|
25
|
+
right skill for the human to fire, the external input needed, the first nail to
|
|
26
|
+
test, or the phase transition that is already due.
|
|
27
|
+
5. Frame it as: where you are, next best action, why now, and done when.
|
|
28
|
+
|
|
29
|
+
## Rules
|
|
30
|
+
|
|
31
|
+
- One action, not a checklist.
|
|
32
|
+
- State-grounded, never generic. Cite the gate, doc, evidence, or file state that
|
|
33
|
+
drives the pick.
|
|
34
|
+
- Return the avoided move, not the easy busywork.
|
|
35
|
+
- If no outside truth is entering, the next action is external input, not another
|
|
36
|
+
internal lap.
|
|
37
|
+
- If the gate is already met, the action is to move phase or ship, not add another
|
|
38
|
+
surface.
|
|
39
|
+
- Read-only on the project. `nba` recommends; it does not execute.
|
|
40
|
+
- Do not auto-invoke user-only skills. Tell the human when one is the next move.
|
|
41
|
+
|
|
42
|
+
## Verification
|
|
43
|
+
|
|
44
|
+
Before finishing:
|
|
45
|
+
|
|
46
|
+
1. The recommendation cites the state it read.
|
|
47
|
+
2. There is exactly one next action.
|
|
48
|
+
3. The action has a clear "done when" observable.
|
|
49
|
+
4. A reader can tell why this action beats the other visible options.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: retro
|
|
3
|
+
description: "Turn a finished, failed, or disappointing work cycle into portable lessons, anti-patterns, quality gates, and next-cycle vocabulary. Use after a build, QA pass, demo, user complaint, or abandoned attempt when the useful output is what the next pass must learn rather than the code itself."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Turn a completed cycle into lessons the next cycle can actually use.
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
`retro` extracts durable learning from a work cycle without defending the artifact
|
|
11
|
+
that produced it. A cycle can run, pass tests, and still be the wrong thing. The
|
|
12
|
+
output is not a changelog or therapy note: it is a local, evidence-backed record
|
|
13
|
+
of what worked, what misled the build, and what gate the next pass must clear.
|
|
14
|
+
|
|
15
|
+
Use `retro` when the artifact is done, failed, disappointing, or ambiguous enough
|
|
16
|
+
that the next agent needs the cycle's lessons more than its momentum.
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
1. Read the original objective, final artifact, QA evidence, user complaints, and
|
|
21
|
+
any local planning notes.
|
|
22
|
+
2. Separate working assets from misleading progress: contracts, schemas, tests,
|
|
23
|
+
services, vocabulary, and examples that earned reuse vs. UI, panels, scaffolds,
|
|
24
|
+
or abstractions that only looked productive.
|
|
25
|
+
3. Name each failure as an anti-pattern, not a mood.
|
|
26
|
+
4. Convert repeated or high-impact failures into quality gates for the next pass.
|
|
27
|
+
5. Convert vague user direction into architecture vocabulary a fresh agent can
|
|
28
|
+
use.
|
|
29
|
+
6. Write or refresh local docs for the cycle: a retro for lessons and a plan for
|
|
30
|
+
next-cycle contracts, gates, and vocabulary.
|
|
31
|
+
7. Verify that a from-scratch agent could avoid the same failure from those docs
|
|
32
|
+
alone.
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- Do not defend the artifact. If it missed the product, say what missed.
|
|
37
|
+
- Do not write a changelog. File lists and effort summaries are not lessons.
|
|
38
|
+
- Preserve negative corpus. Failed paths are training data.
|
|
39
|
+
- Prefer hard gates over advice.
|
|
40
|
+
- Cite evidence from the cycle: objective, file facts, QA output, screenshots,
|
|
41
|
+
transcripts, diffs, or user feedback.
|
|
42
|
+
- If the next agent cannot act on it, it is not a lesson yet.
|
|
43
|
+
- Keep provenance local; shipped artifacts should not narrate their scars.
|
|
44
|
+
|
|
45
|
+
## Verification
|
|
46
|
+
|
|
47
|
+
Before finishing:
|
|
48
|
+
|
|
49
|
+
1. Every lesson traces to observed cycle evidence.
|
|
50
|
+
2. Every anti-pattern names a concrete failure mode and the gate that catches it.
|
|
51
|
+
3. A fresh agent can tell what to preserve, what to discard, and what to test
|
|
52
|
+
first without reading the whole old session.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scratch
|
|
3
|
+
description: "Restart a project or artifact from v0 while preserving only proven lessons, contracts, gates, vocabulary, real-surface tests, and negative corpus. Use when the foundation is wrong, accumulated code is misleading progress, or a new pass should learn from the old one without inheriting its accidental architecture."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Start over from what the previous cycle proved, not from what it happened to
|
|
7
|
+
build.
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
`scratch` is a controlled restart. It keeps earned knowledge and refuses to copy
|
|
12
|
+
forward accidental architecture. Starting from scratch is not amnesia: contracts,
|
|
13
|
+
schemas, vocabulary, real-surface tests, quality gates, and negative corpus survive
|
|
14
|
+
when they earned it. Scaffold, explanatory UI, debug panels, shallow generated
|
|
15
|
+
content, and code whose only value was learning what not to do do not.
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
1. Read the current plan, retro, local domain notes, QA evidence, and any user
|
|
20
|
+
complaint that triggered the restart.
|
|
21
|
+
2. Identify what to preserve: contracts, schemas that survived QA, quality gates,
|
|
22
|
+
vocabulary, reusable services, real-surface tests, and negative corpus.
|
|
23
|
+
3. Identify what to discard: explanatory UI, debug panels, scaffold, shallow
|
|
24
|
+
generated content, accidental abstractions, and code whose only value was
|
|
25
|
+
learning what not to do.
|
|
26
|
+
4. Name the first quality gate before planning code.
|
|
27
|
+
5. Write a v0 skeleton plan with one complete vertical loop.
|
|
28
|
+
6. Build only the first loop until it clears the gate.
|
|
29
|
+
|
|
30
|
+
## Rules
|
|
31
|
+
|
|
32
|
+
- Starting from scratch means no copy-forward unless the artifact earned it.
|
|
33
|
+
- One complete vertical loop beats many shallow surfaces.
|
|
34
|
+
- Preserve provenance in local docs, not in the shipped product.
|
|
35
|
+
- Do not rebuild around a vague lesson. Turn it into a gate or leave it out.
|
|
36
|
+
- Do not delete negative corpus; archive or reference it where the next cycle
|
|
37
|
+
will see it.
|
|
38
|
+
- If a reusable module survives, name the contract that proved it survives.
|
|
39
|
+
|
|
40
|
+
## Verification
|
|
41
|
+
|
|
42
|
+
Before finishing:
|
|
43
|
+
|
|
44
|
+
1. The preserve/discard split is explicit and evidence-backed.
|
|
45
|
+
2. The new v0 plan has one complete vertical loop and a named first gate.
|
|
46
|
+
3. No old architecture is copied forward merely because it exists.
|
|
47
|
+
4. A fresh builder can start without rereading the failed codebase.
|
|
@@ -7,7 +7,7 @@ Check what's asserted as real against reality — in both directions — before
|
|
|
7
7
|
|
|
8
8
|
## Goal
|
|
9
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 `
|
|
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 `hate`.
|
|
11
11
|
|
|
12
12
|
## Workflow
|
|
13
13
|
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: hate
|
|
3
3
|
disable-model-invocation: true
|
|
4
|
-
description: "
|
|
4
|
+
description: "Attack a plan, design, or argument like you want it to fail before you commit real effort — return the single load-bearing objection and the cheapest experiment that would prove it matters, not a checklist. User-invoked on purpose: a hate-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
5
|
---
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Refuse to be nice to the plan — return the one objection that could kill it and the cheapest shot that proves it matters.
|
|
8
8
|
|
|
9
9
|
## Goal
|
|
10
10
|
|
|
11
|
-
Where `shower` asks "can a stranger follow this?" (comprehension), `
|
|
11
|
+
Where `shower` asks "can a stranger follow this?" (comprehension), `hate` asks "what would someone who wants this to fail attack first?" (validity). It is the **superset** reflex: where `factchk` checks one fact and `mandela` audits one validation, `hate` attacks the *whole* plan and collapses it to a single root. The highest-value output is never a checklist — it's one objection plus the cheaper experiment hiding inside the elaborate plan.
|
|
12
12
|
|
|
13
13
|
## Workflow
|
|
14
14
|
|
|
15
15
|
1. Pin the **load-bearing assumption(s)** — what must hold for the whole thing to stand.
|
|
16
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**
|
|
17
|
+
3. Collapse the findings to the **single root** objection — the one whose failure makes the others moot.
|
|
18
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
19
|
5. Return `{ root, first_nail }` — not a list.
|
|
20
20
|
|
|
21
21
|
## Rules
|
|
22
22
|
|
|
23
|
-
- **
|
|
23
|
+
- **Attack, don't improve** — improving is a different reflex.
|
|
24
24
|
- Compose, don't duplicate — invoke `factchk` and `mandela` for their axes; you own the synthesis to one root.
|
|
25
25
|
|
|
26
26
|
## Verification
|
|
@@ -7,7 +7,7 @@ Audit a validation for leakage: does outside ground-truth actually enter, or is
|
|
|
7
7
|
|
|
8
8
|
## Goal
|
|
9
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 `
|
|
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 `hate` calls `mandela` for the leakage axis of a design.
|
|
11
11
|
|
|
12
12
|
## Workflow
|
|
13
13
|
|