From 82074a7ab5ace781023c5dc4f2a6764f33acbb15 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 16 Sep 2026 12:26:08 +0200 Subject: [PATCH] Fold the Ghostlight L0 lessons into the briefs and the fork rule The Soul template now attacks constructibility at sealed boundaries (a derive is a public constructor, and on stable rustc a compile_fail test does not pin its error code). It also asks for forgeries shaped like real values and treats text scanners as tripwires with stated limits. The Hands template now says to wait for long jobs instead of reporting a to-do list, to restore mutations without git checkout, to measure warnings from forced rebuilds, and to prefer semantic tools for semantic properties. The fork rule now weighs proportion: a fork guarding only against the project's own code gets a default and a recorded follow-up. Evidence: Ghostlight's library extraction postmortem, recorded in the changelog. Co-Authored-By: Claude Opus 5 --- SKILL.md | 5 ++++- references/briefs.md | 20 ++++++++++++++++++++ references/changelog.md | 28 ++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/SKILL.md b/SKILL.md index 2570647..3407684 100644 --- a/SKILL.md +++ b/SKILL.md @@ -142,7 +142,10 @@ in the session. Distinguish a real fork from a default. "Should I use the conventional thing" is not a question. "3-5 are not decisions," as the operator put it, is the failure -of asking about non-decisions. +of asking about non-decisions. Weigh proportion too: a fork that guards only +against the project's own code, such as how strictly to enforce an internal +tripwire, gets a default and a recorded follow-up. Asked how much one such +question mattered, the operator said not at all. ### 3. Hands executes one cut diff --git a/references/briefs.md b/references/briefs.md index 9bf26fe..f1f6002 100644 --- a/references/briefs.md +++ b/references/briefs.md @@ -90,6 +90,15 @@ it reported was fiction. When a cut deletes, list every rule that had a test before and has none after. A rule that still exists in code with its only test deleted is the failure mode of subtraction; either the rule goes too, or it gets a test in the same cut. +Long jobs: wait for them and finish. Never end the turn with a to-do list in +place of a report. +Mutations: restore with a reverse edit or run against committed code; `git +checkout` also reverts uncommitted fix code and silently invalidates the run. +Warnings: measure from a forced rebuild and compare distinct messages; cargo +replays warnings only when it actually rebuilds. +Semantic properties ("exactly one call site", "this step actually runs"): +prefer a semantic tool (a Clippy lint, the type system) over a text scanner, +or state the scanner's limits in the test itself. Commits: - Small and pushed. @@ -147,6 +156,17 @@ Falsify specifically: including ones that are not plain reverts> - +- +- +- - - rerun the builds, tests and captures yourself diff --git a/references/changelog.md b/references/changelog.md index 582ba59..af20a7e 100644 --- a/references/changelog.md +++ b/references/changelog.md @@ -2,6 +2,34 @@ Record each change to the skill together with the evidence that motivated it. +## 2026-09-16: sealing, forgeries, scanners and proportion, from Ghostlight L0 + +Evidence: Ghostlight `docs/architecture/ghostlight-library-extraction-postmortem.md` +and its cut map. + +- **Soul attacks constructibility, not names.** Ruling Q1-4 said sealed + constructors must be unreachable. Ten compile_fail doc-tests passed while + every public ID type derived `Deserialize`, so an external crate built any of + them from JSON; an ID-minting `Default` impl left all ten green. It was found + only because Self added the serde route to the Soul brief by hand. On stable + rustc the compile_fail error codes are not enforced either. +- **Rejection tests need realistic forgeries.** Short fake digests passed + against kernels comparing only length, a prefix, all but the last character, + case-insensitively, or only the hex after the label. Five mutants survived + across two Soul passes. +- **Text scanners are tripwires.** Every one written in the campaign lost to a + short evasion: a single-minter count to an alias, a subdirectory, a type + alias and a function value; a deploy wiring test to a two-line deletion that + reattached the pinned line to the wrong container, and its fix to `if false` + around exact lines. Prefer a semantic tool, or state the limits. +- **Default proportionate forks.** Asked how much the single-minter enforcement + question mattered, the operator said not at all. A fork that guards only + against the project's own code is a default plus a recorded follow-up. +- **Hands brief additions:** wait for long jobs instead of reporting a to-do + list (one Hands agent did); restore mutations without `git checkout` (one + run was invalidated that way); measure warnings from forced rebuilds (a + cached build reported zero). + ## 2026-09-16: subtraction rules, from the Eureka campaign's own cuts - **A deletion can take a live rule's only test with it.** Cut 4 deleted a store