paperthin 0.5.0 → 0.7.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 +19 -12
- package/.github/workflows/ci.yml +17 -0
- package/.github/workflows/release.yml +39 -0
- package/CLAUDE.md +38 -8
- package/README.md +194 -132
- package/assets/map.svg +103 -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/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 +28 -0
- package/skills/depth/hate/SKILL.md +31 -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/{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
package/assets/map.svg
ADDED
|
@@ -0,0 +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: 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>
|
|
8
|
+
|
|
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>
|
|
12
|
+
|
|
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>
|
|
17
|
+
|
|
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>
|
|
62
|
+
|
|
63
|
+
<!-- depth -->
|
|
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>
|
|
71
|
+
|
|
72
|
+
<!-- breadth -->
|
|
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>
|
|
79
|
+
</g>
|
|
80
|
+
|
|
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>
|
|
88
|
+
</g>
|
|
89
|
+
|
|
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>
|
|
98
|
+
|
|
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"/>
|
|
103
|
+
</svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paperthin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.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
|
+
"adversarial-review",
|
|
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,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.
|
|
@@ -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 `hate`.
|
|
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,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hate
|
|
3
|
+
disable-model-invocation: true
|
|
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
|
+
---
|
|
6
|
+
|
|
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
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
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
|
+
|
|
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** objection — 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
|
+
- **Attack, 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.
|
|
@@ -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 `hate` 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.
|