Release 2.16.0: reachable delegate methods, a readability pass, and one home per rule - #92
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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,
delegationwas in context before the first spawn in 4,model-routingin 5, andexecution-healthin 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-routingmerges intodelegationand 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 ofdocs/decisions.mdwere amended in place.Package evidence
python3 scripts/check.py --base origin/main— passedpython3 scripts/check.py --pytest tests/ -q— 175 passedgit diff --check— cleanpython3 scripts/check_hosts.py --require-codex-validator --skip-install— Claude package validation PASS; Codex package validation and both isolated installs areUNVERIFIED, 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.
delegationbefore first spawnThe 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
UNVERIFIED.🤖 Generated with Claude Code