Skip to content

Release 2.16.0: reachable delegate methods, a readability pass, and one home per rule - #92

Merged
mzored merged 15 commits into
mainfrom
release/2.16.0
Sep 2, 2026
Merged

Release 2.16.0: reachable delegate methods, a readability pass, and one home per rule#92
mzored merged 15 commits into
mainfrom
release/2.16.0

Conversation

@mzored

@mzored mzored commented Sep 2, 2026

Copy link
Copy Markdown
Owner

User-visible result

Three releases, stacked. Users of the plugin get delegate methods that actually load before a delegate is dispatched, methods that can be read, and rules that exist in one place.

2.15.0 — the delegate methods now reach the sessions that dispatch delegates. A field scan of 24 installed sessions on 2.13.x and 2.14.0, with all 102 delegate transcripts beneath them, measured what the old triggers reached: of the 15 sessions that dispatched delegates, delegation was in context before the first spawn in 4, model-routing in 5, and execution-health in none. 31 of 91 spawns named no level for the delegate — 3 of 50 where the routing text was in context, 28 of 41 where it was not. The triggers now name the act. model-routing merges into delegation and is deleted. The kernel drops its compressed delegate paragraph and keeps one obligation at the point of use.

2.15.1 — readability. Scope line in every method, subheadings in every file over ~400 words, long sentences and paragraphs split, lists only where the content was already a set. No rule added, removed, weakened, strengthened, or re-scoped.

2.16.0 — one home per rule, and an outside read that can fire. Five rules had two homes, one of them already drifted. The outside-read rule on a consequential technical decision had no actor and a trigger the run had to grade its own judgment against; it now names the agent and fires on a fact.

Scope

plugins/skiphow/ (kernel plus all 23 methods, both manifests), VERSION, SECURITY.md, CONTRIBUTING.md, CHANGELOG.md, docs/decisions.md, docs/evidence.md. No new ADR files; the owning sections of docs/decisions.md were amended in place.

Package evidence

  • python3 scripts/check.py --base origin/main — passed
  • python3 scripts/check.py --pytest tests/ -q — 175 passed
  • git diff --check — clean
  • python3 scripts/check_hosts.py --require-codex-validator --skip-install — Claude package validation PASS; Codex package validation and both isolated installs are UNVERIFIED, because this machine has no Codex plugin validator.

Runtime evidence

Four arms on one throwaway fixture, three isolated sessions each, same prompt, host, and session model, only the package varying.

package skill loaded delegation before first spawn spawns naming a level
2.14.0 3/3 0/3 0/15
2.15.0 without the kernel obligation 3/3 0/3 0/15
2.15.0 2/3 2/3 5/15
2.15.1 3/3 3/3 15/15

The reworded method-list line alone fired in none of three. The kernel obligation is what fires. It is not what settles behavior: one 2.15.0 run opened the method, wrote that each lane would run at ordinary level, passed no level in any of its five dispatches, and put five lanes in one checkout with the isolation rule in context.

Correctness gate for the readability pass

A corpus-wide content-word diff against the base finds six words present in the base and absent in the tip, each accounted for by hand. A per-sentence check maps every normative sentence in the base into the tip. An independent audit found one real defect the word-level inventory could not catch: removing a pair of em dashes had turned a clause naming the only two grounds for recording a multi-unit plan into a sentence asserting the grounds exist. Fixed.

Review

Four Codex passes on this branch. Findings acted on: the outside-read list reaching too far in one direction and not far enough in the other; the bound on it being the reversibility estimate in a new form; two method-list lines disagreeing with their own scope lines; and readability counts that did not reproduce against the tree, now recomputed with the counting method stated.

Unverified limits

  • Codex package validation and isolated installs on this machine.
  • Whether the new outside-read trigger gets the read taken. The failure it answers is measured, ten runs to zero on both hosts. The replacement is reasoning from the text.
  • Whether the readability structure changes what a run does. A pass whose stated goal is no behavior change cannot be proved by a receipt showing none; the three shipped-tree runs above are a non-regression check, not a claim about structure.
  • Delegates never load SkipHow (0 of 102 in the field scan). That is by design and no harm was found from it, but it is recorded as UNVERIFIED.

🤖 Generated with Claude Code

mzored and others added 15 commits September 2, 2026 18:28
A scan of 24 installed sessions on 2.13.x and 2.14.0 measured what the
delegate triggers reached. Of the 15 that dispatched delegates,
delegation was in context before the first spawn in 4 and model-routing
in 5; execution-health reached 1 of the 24 at any point and none before
a dispatch. 31 of 91 spawns named no level for the delegate: 3 of 50
where the routing text was in context, 28 of 41 where it was not.

Each trigger named something other than the act. delegation opened on
work shape settled earlier, model routing on a decision the run does not
know it is making, and execution-health on states the run has already
entered while its own first rule applies before the step starts. They
now open before a delegate is dispatched and before a step that could
take real time.

model-routing merges into delegation and stops being a separate file,
arriving at the sentence that used to point at it. The kernel drops its
compressed delegate paragraph: the one-outcome rule and the stalled-lane
rule move into delegation, the level rule arrives with the merge, and
the isolation rule joins the preservation paragraph that already governs
placement. That paragraph was in context in all 15 dispatching sessions
and was breached on the level in 31 of 91 spawns and on one outcome per
delegate in 12 briefs of one session; the boundary requirement it does
not compress holds in 90 of 91.

execution-health now names a wait that holds the root's own turn open as
a stop. One session blocked twice on a foreground sleep loop, roughly 54
minutes with six delegates live, and stopped only when the owner said so.

Whether the new triggers change what later runs load is UNVERIFIED.
Paired isolated runs on a throwaway fixture: three sessions per package,
all six dispatched five delegates, all thirty spawns named no level, and
no session on either package opened delegation, the routing text, or
execution-health. The reworded method-list line did not fire.

Removing the kernel's compressed delegate paragraph without leaving
anything at the act would therefore have left the level governed by
nothing that reaches context. The kernel now carries one obligation:
before dispatching a delegate, read delegation. It names no level, no
outcome count and no lane rule, so it duplicates nothing and cannot
drift from the method.

Whether it fires where a roster line did not is UNVERIFIED.
Three sessions on the released tree, one file apart from the arm
without the kernel obligation, put delegation in context before the
first spawn in two of three and in both that selected the skill,
against none of three. Five of fifteen spawns named a level, against
none in either earlier arm.

One run is recorded in full because it limits the claim: it opened
the method, wrote that each lane would run at ordinary level, passed
no level in any of its five dispatches, and put all five lanes in one
checkout with the isolation rule in context. The obligation is
measured to get the file opened. Opening the file is not measured to
produce the routing or the isolation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
No rule is added, removed, weakened, strengthened, or re-scoped. Each
method opens with a scope line repeating the trigger SKILL.md already
carries for it. Every file over roughly 400 words gets sentence-case
subheadings so a rule has an address. Long sentences and paragraphs are
split, one idea to a sentence. Lists appear only where the content was
already a set.

Across the package: 21 em dashes and 70 semicolons removed, sentences
over 40 words down from 44 to 4, paragraphs over 100 words down from 40
to 11, and the 13 files over 400 words that had no subheading now all
have them. The text grew by 718 words, all of it scope lines, headings
and splits, because this project has decided that method length is not
the constraint.

Every file was checked against its previous version for rules lost in
the rewrite. Six content words changed form across the whole package,
each verified by hand: two verb forms, two filler deletions, one
metaphor noun replaced with the mechanism it named, and one ordering
adverb replaced by "last". The frontmatter description is unchanged;
nine measured discovery runs settled its wording in 2.11.1.

Whether the structure changes what a run does is UNVERIFIED.
Auditing all twenty-three roster lines against the scope line each
method now opens with found two that stated fewer conditions than
SKILL.md carries for them. Both drifted in 2.14.0, when conditions
were added to the roster and not to the files.

campaign-direction listed four of six: technical and process growth
without new evidence of the requested result, and a unit that must
create a new prerequisite of its own before it can finish, were
missing. execution-health listed three of six: integration conflicts,
sibling invalidation, and delivery and process work without new
evidence of the requested result were missing.

No rule is added. A scope line restates the trigger so a run that
opens the file can confirm it is in the right place, and one that
covers fewer cases than the roster tells the run the method does not
apply where it does.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Three sessions on the shipped tree loaded the skill three of three,
opened delegation before the first spawn three of three, and named a
level on all fifteen spawns. Against 2.15.0's two of three and five
of fifteen, on three runs per arm, that is a non-regression check and
not a claim that the structure caused the difference.

Also records the two scope lines that had covered fewer conditions
than the method list carries for them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The outside read on a consequential technical decision had no actor
and a trigger the run had to grade its own judgment against. Ten runs
in 2.4.2 made sound decisions and none took the read. It is now owed
whenever the choice adds or replaces something the project then keeps:
a dependency, a service, a schema, a data migration, a public
interface, or custom code chosen over a maintained alternative.
campaign-direction keyed its pointer to the same estimate and now
keys it to the same fact.

Five rules had two homes, found by comparing every normative sentence
in the package against every other. One had already drifted: an item
the code has overtaken closed as done in one file and was reported as
done in the other. Where the act happens away from the rule's home,
the point of use now carries a pointer rather than a copy.

delegation says to set the delegate's level in the dispatch rather
than to name it, after a 2.15.0 receipt showed a run naming the level
in its own message and passing none.

Two kernel rules that tracked-work restates are left alone; 2.8.0
settled that placement and nothing shows those copies drifting.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The outside-read list reached further than the rule it replaced in one
direction and less far in the other. It would have fired on a one-line
dependency and missed an expensive concurrency, security, deployment,
or internal-architecture decision. It now names those boundaries and
excludes a choice held inside one file that a later change can delete
on its own. The decision record says the scope moves both ways instead
of claiming it did not move.

campaign-direction's scope line named a condition its method-list line
did not, so the method said it applied where the kernel would never
open it. The method-list line now carries it.

Removing a pair of em dashes in the kernel had turned a clause naming
the only two grounds for recording a multi-unit plan into a sentence
asserting that the grounds exist. No word was dropped, so the word
level inventory could not catch it. Restored, along with the same
shape in delegation.

Two kernel paragraphs had been joined by a missing blank line.

The readability counts in the changelog and the decision record did
not match the tree and are replaced with measured ones, together with
the counting method. The kernel lost fifty-four words rather than a
paragraph.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The bound on the outside read asked whether a later change could
delete the choice on its own. That is a prediction about future
coupling, sitting one sentence before the claim that these are facts
rather than estimates. It is now a present-state test: an
implementation choice in one file is outside the rule while nothing
outside that file depends on it and this same change establishes it
as no boundary for later work.

campaign-direction's method-list line and its scope line disagreed a
second time, on whether a record claiming the conditions is enough or
live evidence is required. The method requires live evidence, which is
what 2.14.0 settled about records. Both lines now say so.

The readability counts were measured with a script that split
paragraphs on single newlines. Recounted on blank-line paragraphs: 44
long sentences to 6, 41 long paragraphs to 12, and 772 words added
rather than 360.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The scope line qualified the first three conditions with live evidence
and introduced the other three in a second sentence, so the two lines
still did not state the same trigger. The six are now a list under one
qualifier, which is also how execution-health states its own anomaly
set.

The changelog said the surviving semicolon sits in a description that
tests/test_package.py pins. The test checks substrings, not
punctuation. The real reason the description is left alone is that
nine measured discovery runs settled its wording in 2.11.1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The method-list line said machinery expanding after its target was
met and the scope line said its stated target, which is narrower. The
gate decides when the method opens, so the method now uses the gate's
wording. The changelog's inventory of lists also omitted the one this
release added.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@mzored
mzored merged commit d6c3140 into main Sep 2, 2026
1 check passed
@mzored
mzored deleted the release/2.16.0 branch September 2, 2026 16:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant