v7's Bitter Pill direction is the right call — we ran the same de-drift exercise on our own install last month and cut heavily. One thing we learned doing it: the drift grows back. Skills get edited under deadline, new workflows copy old scaffolding patterns, and six weeks later the over-instruction is back — silently, because nothing checks for it.
v7 ships the philosophy (system prompt § Ideal-State Prompting) and BitterPillEngineering for manual audits. The missing piece is the deterministic tool: something that flags drift the moment a skill file is saved or a release is cut, the way the case-portability gate now catches path-casing.
We've been running exactly that in production and would be glad to donate it — as reference code or just as the design, whatever fits your pipeline:
What it does (advisory-only — flags candidates, never edits, human judges):
- V1 — over-specified procedure: rigid sequencing and long imperative step-lists a capable model would order itself ("in this order", "do not deviate", 10+ numbered steps).
- V2 — trust-deficit scaffolding: coercion written for a weaker model — "MANDATORY", "Zero Exceptions", "REQUIRED BEFORE ANY ACTION", threat-flavored emphasis.
- V3 — obviated scaffolding: structure a current-generation model no longer needs. Taxonomy-only in v1 — the class is named, detector rules aren't written yet.
What it deliberately does NOT flag as drift: the same four classes your Ideal-State Prompting section protects — safety gates, verified gotchas, tool contracts, output-format contracts. Those legitimately look like "HOW"; the linter's advisory framing exists exactly because that boundary needs a human.
Shape: single-file TypeScript (Bun, no deps, ~150 lines, MIT). --strict exits non-zero on HIGH findings, so it drops into a release pipeline or pre-save hook as a gate. Honest limitations: precision is high on V2 (coercion patterns), heuristic on V1 (procedure detection), and V3 is taxonomy-only so far — V1 and V3 detection are where a smarter matcher would help, and where I'd welcome direction.
Evidence it's needed even post-cut: we ran the linter against the 51 SKILL.md files shipped in the v7.1.1 payload — re-verified against both the v7.1.1 tag and main HEAD, identical result (also identical on 7.0.0). Result over those 51 files: 51 scanned · 33 flagged · 97 high-severity hits — mostly V2 patterns ("MANDATORY", "before any action", "not optional") plus a few long imperative step-lists (V1). Widen the scan to the whole skills tree (workflows included, 693 files) and it's 220 flagged. The structurally interesting one: CreateSkill/SKILL.md itself opens with 🚨 MANDATORY: … (REQUIRED BEFORE ANY ACTION) — the template every new skill is generated from carries the V2 markers, so the pattern propagates at skill-creation time. That also makes it the highest-leverage fix available: one edit in the template retires every future instance. Our own estate scored worse before our cut, and plenty of hits are legitimate keep-class lines — exactly why it's advisory. It's the same drift-regrowth we saw on our own install, just visible on a fresh release: hand-maintained scaffolding creeps back, so the check has to be mechanical and continuous, not a one-time audit.
Reference implementation (scrubbed, runnable as-is): https://gist.github.com/rpriven/82ecc6c832d46d35c97a3c7918de06ae
Reproduce the numbers (with the gist's skill-linter.ts in your cwd):
git clone -b v7.1.1 --depth 1 https://github.com/danielmiessler/LifeOS && bun skill-linter.ts --dir LifeOS/LifeOS/install/skills gives the tree figure; the 51 SKILL.md files give the headline figure. No action needed either way — the tool is yours to take: build it in your private source the way recent fixes have gone and this issue is just the spec, or say the word and I'll PR it.
Developed on our production v6 estate; all numbers above are from running it against a clean v7.1.1 checkout in a fresh environment. Same lane as #1404.
v7's Bitter Pill direction is the right call — we ran the same de-drift exercise on our own install last month and cut heavily. One thing we learned doing it: the drift grows back. Skills get edited under deadline, new workflows copy old scaffolding patterns, and six weeks later the over-instruction is back — silently, because nothing checks for it.
v7 ships the philosophy (system prompt § Ideal-State Prompting) and BitterPillEngineering for manual audits. The missing piece is the deterministic tool: something that flags drift the moment a skill file is saved or a release is cut, the way the case-portability gate now catches path-casing.
We've been running exactly that in production and would be glad to donate it — as reference code or just as the design, whatever fits your pipeline:
What it does (advisory-only — flags candidates, never edits, human judges):
What it deliberately does NOT flag as drift: the same four classes your Ideal-State Prompting section protects — safety gates, verified gotchas, tool contracts, output-format contracts. Those legitimately look like "HOW"; the linter's advisory framing exists exactly because that boundary needs a human.
Shape: single-file TypeScript (Bun, no deps, ~150 lines, MIT).
--strictexits non-zero on HIGH findings, so it drops into a release pipeline or pre-save hook as a gate. Honest limitations: precision is high on V2 (coercion patterns), heuristic on V1 (procedure detection), and V3 is taxonomy-only so far — V1 and V3 detection are where a smarter matcher would help, and where I'd welcome direction.Evidence it's needed even post-cut: we ran the linter against the 51
SKILL.mdfiles shipped in the v7.1.1 payload — re-verified against both the v7.1.1 tag and main HEAD, identical result (also identical on 7.0.0). Result over those 51 files:51 scanned · 33 flagged · 97 high-severity hits— mostly V2 patterns ("MANDATORY", "before any action", "not optional") plus a few long imperative step-lists (V1). Widen the scan to the whole skills tree (workflows included, 693 files) and it's 220 flagged. The structurally interesting one:CreateSkill/SKILL.mditself opens with🚨 MANDATORY: … (REQUIRED BEFORE ANY ACTION)— the template every new skill is generated from carries the V2 markers, so the pattern propagates at skill-creation time. That also makes it the highest-leverage fix available: one edit in the template retires every future instance. Our own estate scored worse before our cut, and plenty of hits are legitimate keep-class lines — exactly why it's advisory. It's the same drift-regrowth we saw on our own install, just visible on a fresh release: hand-maintained scaffolding creeps back, so the check has to be mechanical and continuous, not a one-time audit.Reference implementation (scrubbed, runnable as-is): https://gist.github.com/rpriven/82ecc6c832d46d35c97a3c7918de06ae
Reproduce the numbers (with the gist's
skill-linter.tsin your cwd):git clone -b v7.1.1 --depth 1 https://github.com/danielmiessler/LifeOS && bun skill-linter.ts --dir LifeOS/LifeOS/install/skillsgives the tree figure; the 51SKILL.mdfiles give the headline figure. No action needed either way — the tool is yours to take: build it in your private source the way recent fixes have gone and this issue is just the spec, or say the word and I'll PR it.Developed on our production v6 estate; all numbers above are from running it against a clean v7.1.1 checkout in a fresh environment. Same lane as #1404.