@csark0812/skeleton 1.6.0 → 1.6.2
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/README.md +19 -15
- package/dist/cli.js +5 -4
- package/package.json +1 -1
- package/schemas/config.schema.json +2 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Skeleton
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<!-- source-of-truth: Package overview -->
|
|
4
4
|
|
|
5
5
|
<!-- doc-meta: owner=eng | last-reviewed=2026-08-16 -->
|
|
6
6
|
|
|
@@ -36,7 +36,7 @@ Does an intact Skeleton contract change agent behavior — grounding on the righ
|
|
|
36
36
|
|
|
37
37
|
### What we did
|
|
38
38
|
|
|
39
|
-
We ran a paired live A/B harness with [`@post-print/agent-test`](https://www.npmjs.com/package/@post-print/agent-test): `skeleton-clean` vs `skeleton-messy`. Same prompts and scenario set; the only intentional difference was
|
|
39
|
+
We ran a paired live A/B harness with [`@post-print/agent-test`](https://www.npmjs.com/package/@post-print/agent-test): `skeleton-clean` vs `skeleton-messy`. Same prompts and scenario set; the only intentional difference was SSOT / conflict structure and context profile.
|
|
40
40
|
|
|
41
41
|
Scenarios covered contested grounding (conflicting docs), docs-only validation routing, canonical grounding, owned-skill routing, and customize ownership. Protocol: **N=10** sequential paired compares on 2026-07-17; McNemar on paired pass/fail; median token deltas with a bootstrap CI on the mean.
|
|
42
42
|
|
|
@@ -50,7 +50,7 @@ Full method: [refs/llm-harness.md](refs/llm-harness.md). Suites: [agent-suites/R
|
|
|
50
50
|
|
|
51
51
|
On tasks that depend on an intact SSOT, the clean fixture was both more accurate and cheaper:
|
|
52
52
|
|
|
53
|
-
- **Contested grounding** — In every paired run, clean settled on the
|
|
53
|
+
- **Contested grounding** — In every paired run, clean settled on the SSOT canonical; messy never did (McNemar p = 0.002). Clean hops the catalog/SSOT path; messy thrashes across conflicting docs.
|
|
54
54
|
- **Docs routing** — Clean consistently chose the correct audit lane; messy invented a non-existent `audit all` path (McNemar p = 0.002).
|
|
55
55
|
- **Token cost** — Across grounding tasks, messy used a median **~312k** more tokens than clean (bootstrap 95% CI on the mean excludes 0). Pass rate alone understates the gap: messy can still luck into an answer while spending far more.
|
|
56
56
|
|
|
@@ -94,7 +94,7 @@ Flag details: [install](docs/developer/install.md).
|
|
|
94
94
|
- **SSOT summary fit** — heuristic overlap between the one-liner and the body (warn / `--strict`)
|
|
95
95
|
- **Link audit** — broken refs, skill links, anchors in scanned markdown
|
|
96
96
|
- **Skill index** — disk matches taxonomy READMEs in detected skill roots
|
|
97
|
-
- **
|
|
97
|
+
- **deny.paths** — globs for files that must not exist (often outside `scan.include`)
|
|
98
98
|
- **Coverage gaps** — markdown outside the scan perimeter (warn-only)
|
|
99
99
|
- **Doc meta + stale dates** — owner and `last-reviewed` on indexes and SSOT-bearing files
|
|
100
100
|
- **Prose policy** (optional plugins) — YAML pattern rules; idle with no plugins
|
|
@@ -104,27 +104,31 @@ Agents skim `.skeleton/catalog.md` (generated, gitignored) before opening full p
|
|
|
104
104
|
|
|
105
105
|
Skeleton doesn't replace your code gates. Keep TypeScript, Python, Nx, pytest, and the rest in the repo that owns them.
|
|
106
106
|
|
|
107
|
-
## The
|
|
107
|
+
## The contract
|
|
108
|
+
|
|
109
|
+
Config lives in **`skeleton.toml`** at the repo root (preferred). Optional under `.skeleton/`:
|
|
108
110
|
|
|
109
111
|
```
|
|
112
|
+
skeleton.toml # scan perimeter, deny.paths, docsLint, …
|
|
110
113
|
.skeleton/
|
|
111
|
-
├──
|
|
112
|
-
├──
|
|
113
|
-
|
|
114
|
-
└── customize/ # project-specific skill overrides (optional)
|
|
114
|
+
├── catalog.md # generated by `skeleton catalog` (gitignored)
|
|
115
|
+
├── plugins/ # optional consumer audit plugins (.ts + built .mjs)
|
|
116
|
+
└── customize/ # project-specific skill overrides (optional)
|
|
115
117
|
└── code-review.md
|
|
116
118
|
```
|
|
117
119
|
|
|
118
|
-
|
|
120
|
+
Legacy `.skeleton/config.yaml` still loads when no TOML is present.
|
|
121
|
+
|
|
122
|
+
Every canonical doc opts into the catalog with a marker:
|
|
119
123
|
|
|
120
124
|
```markdown
|
|
121
|
-
|
|
125
|
+
<!-- source-of-truth: Backend API conventions -->
|
|
122
126
|
```
|
|
123
127
|
|
|
124
|
-
|
|
128
|
+
Then refresh the agent index:
|
|
125
129
|
|
|
126
130
|
```bash
|
|
127
|
-
skeleton
|
|
131
|
+
skeleton catalog
|
|
128
132
|
```
|
|
129
133
|
|
|
130
134
|
Synced skills stay pristine. Project overrides live in `.skeleton/customize/<slug>.md` and inject when the skill is read — no editing copied `SKILL.md` files.
|
|
@@ -133,8 +137,8 @@ Synced skills stay pristine. Project overrides live in `.skeleton/customize/<slu
|
|
|
133
137
|
|
|
134
138
|
```bash
|
|
135
139
|
skeleton init [--skills] [--force-hooks]
|
|
136
|
-
skeleton
|
|
137
|
-
skeleton audit docs|skills|self [--strict] [--paths=a,b] [--fix[=doc-meta|anchors]] [--dry-run]
|
|
140
|
+
skeleton catalog [--check]
|
|
141
|
+
skeleton audit docs|skills|self [--strict] [--paths=a,b] [--fix[=doc-meta|anchors|ssot]] [--dry-run]
|
|
138
142
|
skeleton build-plugin [path] [--check]
|
|
139
143
|
skeleton validate changed [--staged | --base <ref>] [paths…]
|
|
140
144
|
skeleton references sync|check
|
package/dist/cli.js
CHANGED
|
@@ -18446,8 +18446,9 @@ import { relative as relative5 } from "node:path";
|
|
|
18446
18446
|
|
|
18447
18447
|
// src/audit/core/ssot.ts
|
|
18448
18448
|
var SSOT_COMMENT_RE = /<!--\s*source-of-truth:\s*([\s\S]*?)\s*-->/gi;
|
|
18449
|
-
var
|
|
18450
|
-
var
|
|
18449
|
+
var HWS = "[ \\t]*";
|
|
18450
|
+
var SSOT_VISIBLE_LINE_RE = new RegExp(`^${HWS}source-of-truth:${HWS}(.+?)${HWS}$`, "gim");
|
|
18451
|
+
var LEGACY_BANNER_LINE_RE = new RegExp(`^${HWS}\\*\\*Source of truth for\\*\\*${HWS}(.+?)${HWS}$`, "gim");
|
|
18451
18452
|
function cleanSummary(raw) {
|
|
18452
18453
|
return raw.replace(/\s+/g, " ").trim().replace(/\.$/, "").trim();
|
|
18453
18454
|
}
|
|
@@ -30836,7 +30837,7 @@ function checkStaleReview(input) {
|
|
|
30836
30837
|
if (ageDays <= staleDays)
|
|
30837
30838
|
return null;
|
|
30838
30839
|
return issue("doc-meta", relPath2, {
|
|
30839
|
-
message: `doc-meta last-reviewed ${reviewedStr}
|
|
30840
|
+
message: `doc-meta last-reviewed ${reviewedStr} exceeds re-read cadence (>${staleDays} days) — re-affirm the paper or bump after review`,
|
|
30840
30841
|
severity: "warning"
|
|
30841
30842
|
});
|
|
30842
30843
|
}
|
|
@@ -30860,7 +30861,7 @@ function checkGitFreshness(input) {
|
|
|
30860
30861
|
if (committed.getTime() <= reviewed.getTime())
|
|
30861
30862
|
return null;
|
|
30862
30863
|
return issue("doc-meta", relPath2, {
|
|
30863
|
-
message: `content changed after last-reviewed ${reviewedStr} (git: ${gitDate}) — bump last-reviewed
|
|
30864
|
+
message: `content changed after last-reviewed ${reviewedStr} (git: ${gitDate}) — review no longer covers latest edit; bump last-reviewed after review`,
|
|
30864
30865
|
severity: "warning"
|
|
30865
30866
|
});
|
|
30866
30867
|
}
|
package/package.json
CHANGED
|
@@ -41,7 +41,8 @@
|
|
|
41
41
|
},
|
|
42
42
|
"daysUntilStale": {
|
|
43
43
|
"type": "integer",
|
|
44
|
-
"minimum": 1
|
|
44
|
+
"minimum": 1,
|
|
45
|
+
"description": "Re-read cadence in days for doc-meta last-reviewed (warn; --strict → error). Separate from git edit-behind-review checks."
|
|
45
46
|
},
|
|
46
47
|
"docsLint": {
|
|
47
48
|
"type": "object",
|