Skip to content

Review-run defects: values a worker can trust, findings a reader can act on, and a status that says where the run stands - #448

Merged
m2ux merged 17 commits into
workflowsfrom
workflow/446-review-run-defects
Aug 8, 2026
Merged

Review-run defects: values a worker can trust, findings a reader can act on, and a status that says where the run stands#448
m2ux merged 17 commits into
workflowsfrom
workflow/446-review-run-defects

Conversation

@m2ux

@m2ux m2ux commented Aug 8, 2026

Copy link
Copy Markdown
Owner

Summary

A full work-package run in review mode surfaced a register of defects and conventions (#446, plus the ten follow-up comments on it). This change addresses every one of them that lands in the workflow definitions. Two rows from the register are out of scope here because their fix is not a definition change: the missing batch block, which is server behaviour, and the backfill of existing artifacts, which is host-repository work.

The work falls into three groups.

Values a worker can trust

Several values reached a worker with no producer, or named a thing other than the one they were used for.

A repository the request names now reaches every run. The step that extracts it only ran when the request stated resume intent, so on a fresh run nothing held the component under work. It runs on every path.

A GitHub call that names a working tree now addresses that tree's repository. The coordinate resolver preferred the session's repository binding whenever it was set — and it is always set. On a monorepo that binding names the superproject, so a component's issues, pull requests and reviews all addressed the host. A caller that names a checkout has said which repository the call is about, and that checkout's origin is now what the call resolves. The run that produced this register avoided the fault only because two workers noticed independently and passed the component repository literally to every call.

The component's working tree is a declared value. Three worktree operations each re-derived it from a different guess, and the operations that address the component's repository had no path to name. One value, produced once.

The component-selection gate records which component was chosen. Its only option carried "stop asking" and named no submodule, so the worker landed the path from its own ranking and a user who picked differently was silently overridden. The enumerated submodules are now offered one at a time and the accepted one lands in component_path. A monorepo that leaves the gate with nothing chosen fails there rather than proceeding against the host root.

The work carries one name. The slug that names the planning folder is the session's durable key, and the operation composing it declared an input no step supplied — so each worker invented the name, and a resume looked for a folder the first run never wrote. A new operation takes the name from the request's own words.

Comprehension artifacts land in the corpus. The directory variable defaulted to the empty string, so the artifact went to the session's planning folder, was read once and lost. All three writes in that activity now target the cumulative corpus.

A resource reference a client activity receives resolves. Meta techniques cited their own resources by a path carrying no workflow segment, so a client activity received refs like planning-readme#template that resolve nowhere. The citations carry the segment, and the emitted ref resolves for every consumer.

Gates that ask what the run can answer

On the review path nobody in the session fixes anything: no component file may be modified, and every finding travels to the pull-request author. The strategic-review gate nonetheless offered "Fix findings before proceeding", "Fix selected findings" and "Defer findings" — a choice between actions none of which that run can take.

The create path and the review path now carry their own findings gate. The create-path gate is unchanged. The review-path gate asks which findings the posted review carries to the author: raise all, raise selected, raise none, or hold.

Behind it, the review-fix cycle in post-implementation review had no mode gate at all, so an actionable finding would have edited and committed to the author's branch. It is gated out, which makes the definitions' own claim — no component file is modified — structural rather than stated. The routing flags are renamed to say what they mean on both paths: a finding reached a severity that warrants action, rather than an order to repair it.

The validation gate's message was a question implying the session owned the branch; it now states the choice, and its options name what each does.

Findings a reader can act on

Across three reports, fifteen findings deviated from the declared field list in all fifteen cases, one invented a field, one report used a designator prefix that appears nowhere in the definitions, nine findings carried no severity at all, eight carried values outside the declared scale, one finding was classified into no delivery class, and restructuring silently broke 23 links. The conformance pass ran over these artifacts and reported that they conformed — it verifies artifact-level properties and had no rule that could see any of it.

One shared layout, declared once. A new findings-report guide owns the shape every findings report follows: a finding is a heading, then one labelled paragraph per declared field, in the order that report declares. The code review, test-suite review and strategic review each declare only their own designator prefix and field list against it. Before this, one of them stated its findings as rows of four differently-shaped wide tables, some cells running to a paragraph against a two-word cell beside them.

A finding is a heading, because the summary's designator column links to it and a bold title is unlinkable. The label set is closed, so a field nobody declared is a visible breach rather than a judgement call. The site is carried by the inline link in the prose rather than by a separate location field, which would state it twice in one artifact.

Severity is checkable. The declared scale and the map from the classification scale onto it already existed; nothing checked that a rendered value came from the scale, or that it was the value the map produces from that finding's own classification. Both are now stated as constraints, along with the two rules the run needed: a qualifier is not part of a severity value, and a report that produces findings produces their severities.

Findings order by ID, and every finding the run produces appears in exactly one delivery class — compared as sets, since hand-written ranges are where a finding falls through.

Every code reference is an inline link whose visible text is the named entity, reading as part of the sentence that holds it. Four shapes fail it and each is repaired by moving the link onto the name. Applied by hand to one run's comprehension artifact this took 34 links to 179; without the generator change the next run undoes it.

Every anchor inside the planning folder resolves. A markdown anchor that does not resolve renders as a working link that goes nowhere.

The conformance pass enforces all of it, over the report and its method record alike.

Each review emits two artifacts. Measured over the run's three reports, between 48% and 65% of each was methodology — real work, but it answers how the review was conducted rather than what the author should do, and the part with an addressee was a minority of the document holding it. The findings and the outcome are the report; the baseline, the enumerations, the sweeps that came back clean and the coverage tables are a method record beside it. A finding's own evidence stays with the finding — the split is between method and conclusions, never between a conclusion and its support.

The posted summary's tables lose the columns that fought for width. The header field naming workflow activities is called Activities, not Reviewers, which in a pull request means the people whose approval the change waits on. The prior-feedback table drops its Reasoning column and constrains Disposition to its three values. The per-section report links are gone; the header lists them once.

The status a run emits

Between dispatches the run emitted multi-paragraph summaries restating what the artifact already recorded, and a paraphrase drifts from its artifact with no way for the reader to tell which is authoritative.

A status emission now carries three things: a link to the artifact the completed activity produced, a one-line summary, and the complete activity checklist as a task list whose item text is the Progress row's number and name, and is itself the link. Workflow mechanics stay out — dispatch, worker identities, batch room, usage recording, commit bookkeeping. What the user needs in order to decide stays in, at whatever length it takes.

It is emitted as the last phase of commit-and-persist, after that operation confirms the remote holds the commit, which makes publishing a link before its artifact structurally impossible. A gate is reached mid-activity, before that commit, so there the checklist is resolved against the remote first: present renders as a link, absent renders as plain text.

The shared shape sits on the workflow-engine contract rather than on either operation that spends it, since a rule naming what a sibling operation emits binds beyond the operation it sits on.

Blast radius that says what it measured

Two changed symbols returned no callers and a LOW rating against a freshly re-analysed index. The graph holds no edge because the callers' bodies are macro-generated, and type-level references are not edges at all — so re-analysing changes nothing. In a Substrate codebase that removes most of the interesting edges, and the standing guidance read as though staleness were the only failure mode. The blind spot is recorded where the GitNexus guidance lives, and a blast radius now says whether it rests on graph edges or on a hand-derived caller set.

The bootstrap text

Carried in alongside the register, because it is the same fault on the surface that can least afford it. This text is read by an agent holding a git checkout and a tool surface and nothing else — that is what a bootstrap is for. It nonetheless explained itself in the vocabulary of the framework it had not yet delivered: activities and gates, the meta session and the client session it dispatches, planning folders, the operations bundle, drift detection, delivery topology, and a character budget the server measures over everything arriving before the first decision.

None of it is executable from that position, and some of it manufactured the very impulse it existed to check — a line forbidding a schema fetch was the only mention of a schema in the file, so a reader with no reason to want one came away holding a rule about it.

The file is now the three steps and the two rules that bind before the bundle is read. It went from 67 lines to 42, and every sentence left is one the reader can act on with what it has.

Conduct rules

Swept for the same fault once the bootstrap text was clean. Its reader does hold the workflow model, so the test is not what it knows but whether reading a sentence changes what it does. Four families each stated one invariant several times, and 23 rules become 13.

Family Was Now
file-sensitivity-* 3 entries: one threshold in three verbs over three file classes 1
communication-* 4 entries: register and its negation, merit and its negation 1
attribution-prohibition-* 3 entries: one invariant over decisions, comments, docs 1
checkpoint-discipline-* 4 entries, so every agent read two prohibitions aimed at another actor 1

The checkpoint collapse is the one that changes what an agent reads: resolution is the meta-orchestrator's, a worker pauses at the gate, an orchestrator passes the yield up — each role now finds its own clause instead of three vantage points on one fact. The fourth entry only cited present-before-any-resolution, which states it, and no-option-hallucination covers the fabricated-option_id half; it is deleted. The list of sibling delivery rules trailing operational-discipline-resources-via-tool goes too — the reader holds them, and the list goes stale as soon as a fourth is added.

workflow-canonical stated its read-once instruction in both its description and its opening line; the body copy is gone. It is otherwise sound — an ontology whose job is to define the model may teach vocabulary.

One distinction was deliberately lost. The three file-sensitivity entries read without explicit user direction (core configuration), unless specifically requested (build scripts) and request approval before (CI/CD and container files). Read as one threshold in three phrasings, collapsed to the strongest. If build scripts were meant to sit lower than the other two, that entry splits back out.

One finding left open. workflow-canonical carries an authoring standard — no absolute intra-protocol step-number references — which the anti-pattern catalog owns as phase-cited-by-ordinal. The audiences differ (runtime resource versus design-time canon), so it is not straightforwardly dual-homed, but an agent authoring a technique reads both. Which surface owns it is a decision rather than a cleanup.

What the audit of this change found

The canon was walked over the branch itself, twice. Nine defects in what this change ships, all fixed here.

Entry Where What
apply-omits-declared-input prepare-workflow-branch Composed create-worktree with two inputs it no longer declares and passed nothing for the one it now requires. The compose is Protocol prose rather than an activity bind, so the binding guard cannot see it — and the file sits in a workflow this change never opened.
checkpoint-requires-decision findings-delivery An option to hold, where the review-mode transition routes to submit-for-review whatever is chosen and its effect matched another option's. Holding is already the user's at review-summary-approval.
no-technique-resource-dual-home findings guide ∥ conformance pass Both carried the same detect criteria. The guide owns them; the pass names which rule a breach records against.
no-contradictory-rules findings guide ∥ review mode The guide required every report severity to be a render-scale member, while the map keeps Informational out of the summary tables and in the report, where it still needs a value.
canonical-fact-home report guides ∥ review mode Each designator prefix was declared twice — which is the disagreement the prefix rule exists to prevent. Declared once now, by the summary category that indexes the report.
canonical-fact-home conformance pass ∥ link pass Anchor resolution sat apart from the other three unresolved-link classes. One pass answers whether a link resolves.
duplicate-shared-capability authoring ∥ design Two copies of the workflows-library path derivation, which this change had widened in both. Hoisted to meta; the union keeps what each copy held alone.
no-rationale-in-description initiative-name rule Carried its own justification.
avoidance-voice-in-definitions strategic-review field list Explained itself by comparison with its sibling reports.

A sentence-level duplication scan across every touched file went from 16 cross-file repeats to 13. The remainder are legitimate on the catalog's own carve-outs: a worker-directed rule repeated across techniques is correct for reach, citations of one home are pointers rather than second homes, and per-workflow variable declarations are how the variable model works.

The README seed's Progress inventory runs 1 to 33 contiguously — new rows take their place in the sequence rather than a letter suffix — and the code review's method record takes the prefix of the activity that actually writes it.

Inherited inputs, across the corpus

The catalog gained inherited-input-re-declared for a defect this change introduced in three places, and the sweep that followed found 139 more: leaf operations declaring an input a container contract already merges into them.

The loader composes a workflow-root TECHNIQUE.md and any group TECHNIQUE.md into every descendant, so an operation reaches those inputs without declaring them. A leaf that declares one again adds no bind point — it adds a second description of one slot, and the two get edited apart. Most had narrowed the wording to the operation they sat on, so a caller binding the op read the ancestor's contract while a reader of the file took the leaf's, with nothing marking which governed.

139 entries deleted from 88 operations in 15 groups. Protocols are untouched; they reference the same designators and the merge supplies them. The heaviest single group is work-package/techniques/manage-git, where target_path was declared on 7 operations and branch_name on 6, all already on the workflow root.

20 entries stay, each changing the bind contract rather than restating it — a differing #### default, or an optionality the operation genuinely needs. That is what a leaf declaration is for, and it is the carve-out the entry names.

On the count. A script resolves each operation's ancestors, drops the redundant entries, skips the overrides, and re-parses every written file to confirm the entry is gone before counting it; its file count is cross-checked against git status, and both report 88. That cross-check exists because the first version lacked it — a regex consumed a newline, every replacement silently missed, and the run reported 139 deletions it had not made. The number here comes from what changed on disk.

Not changed

The designator-wrap fix proposed in one comment was withdrawn in a later one: a non-breaking hyphen, dropping the hyphen, and freeing width were each tried against the rendered page and none worked, because the break is forced by column width rather than taken at a break opportunity. Nothing in the definitions ever prescribed it, so nothing needed reverting. The remaining candidate — dropping the # column and carrying the designator as the opening token of the Finding cell — trades one readability property for another and is left for a deliberate decision.

Companion change in the host repository

The binding-fidelity guard now reports one stale triage entry: the orphan-input finding for version-control::initialize-folder no longer occurs, because this change gives that input a producer. Deleting the entry from scripts/binding-fidelity-triage.json is a host-repository edit and lands separately. Every other corpus guard passes.

Closes #446

m2ux and others added 9 commits August 8, 2026 08:56
Every value a worker reads has a producer, and each reaches the thing it
names.

- The repository a request names is extracted on every run, not only on a
  resume, so a component under work is identifiable from the start.
- A GitHub call that names a working tree resolves its coordinates from
  that tree, and the session's repository binding is the fallback. On a
  monorepo the binding names the superproject, so a component's issues,
  pull requests and reviews now reach the component.
- The component's git working tree is a declared value, so the three
  worktree operations and the component-addressing GitHub calls read one
  path instead of each re-deriving it.
- The component-selection gate offers the enumerated submodules one at a
  time and lands the accepted one in component_path, so the gate records
  the choice it asked for.
- The work carries one name, taken from the request's own words, so a
  fresh run and a later resume agree on the planning folder.
- Comprehension artifacts land in the cumulative corpus on every write.
- Meta resource citations carry their workflow segment, so a client
  activity receives a resource ref that resolves.
- The review path has its own findings gate, wording actions a review can
  take; the fix cycle is gated out, and the routing flags say a finding
  reached an actionable severity rather than ordering a repair.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A report that states findings now shares its shape with every other, and
the status the orchestrator emits during a run has a declared form.

- A new findings-report guide owns the shared finding layout: a finding
  is a heading, then one labelled paragraph per declared field, in the
  order its report declares. The label set is closed, the site is carried
  by the inline link in the prose, and the anchor a summary designator
  links to exists because the finding is a heading.
- The code review, test-suite review and strategic review each declare
  only their own designator prefix and field list against that layout.
- Each review emits its findings in one report and what it walked in a
  companion method record, so the half with an addressee is not a
  minority of the document it lives in. A finding's own evidence stays
  with the finding, and the conformance pass covers both halves.
- Designators order by ID, a severity is a member of the render scale and
  equals the map applied to its recorded classification, and every
  finding the run produces lands in exactly one delivery class.
- A code reference in any artifact is an inline link whose text is the
  named entity, reading in the sentence that holds it.
- Every markdown anchor inside the planning folder resolves against the
  headings it points at.
- The summary header names Activities rather than Reviewers, the triage
  table drops the column that competed with Finding for width, its
  Disposition holds one of three values, and the report link lives once
  in the header.
- A status emission carries a link, a one-line summary and the complete
  checklist, made after the push confirms so no link precedes its
  artifact; a gate resolves each row against the remote before publishing
  it.
- A GitNexus blast radius says whether it rests on graph edges, since
  call sites inside macro bodies and type-level references are absent
  from the graph however fresh the index.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The guide's shared-shape statement sits under a heading, so a technique
citing one section receives the framing that section reads against.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The pre-session text keeps the two instructions its reader can act on: a
group::operation name is a label for later, and a definition schema is
not fetched here.

The reasons around them went: that the reader has no session yet, that
the steps are therefore self-contained, and that the server measures a
character budget over what arrives before the first decision. None of it
is actionable from this surface, and the budget paragraph spent close to
a thousand characters of the budget it described.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The one sentence left says what a group::operation name in a step is: a
label for the home that rule keeps once the bundle arrives.

The schema prohibition went with it. Nothing else in the procedure names
a schema, so the sentence forbidding a fetch was the only place the idea
existed, and a reader with no reason to want one now has a rule about
it. The instruction not to read a group::operation name now went for the
same reason the sentence beside it can be read affirmatively: saying
when a label resolves already says it does not resolve yet.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This text is read by an agent that has a git checkout and a tool surface
and nothing else. Every sentence is now executable from that position.

Gone: the rationale for deriving the repository here, which argues a
design decision to a reader with no design; the account of what a
response contains, which the reader is about to read; the notes on
session files, planning folders, drift detection and delivery topology,
each naming a thing the reader has no model of; and the framing sentence
about how to read a group::operation name, which taught the vocabulary
of rules, homes and bundles to guard against tokens the steps no longer
carry.

The three steps are the whole of it, and the terms the last one
introduces arrive with the bundle that defines them.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four families each said one thing several times, so an agent read the
same constraint two or three ways and, at the checkpoint rules, read two
prohibitions aimed at somebody else.

- file-sensitivity: one threshold across core configuration, build
  scripts, CI/CD and container files. The three entries carried three
  verbs for the same threshold; the collapsed entry keeps the strongest.
- communication-measured-language: register and the merit that feedback
  addresses, where four entries stated the positive and its negation.
- attribution-prohibition: one invariant over design decisions, code
  comments and documentation.
- checkpoint-discipline: resolution is the meta-orchestrator's, a worker
  pauses, an orchestrator passes the yield up. Each actor reads its own
  clause. The entry that only cited present-before-any-resolution is
  gone, since that rule and no-option-hallucination both already state
  it.

The delivery-rule list trailing operational-discipline-resources-via-tool
is gone with them: the reader holds those rules already, and a list of
them goes stale the moment a fourth is added.

The workflow-canonical ontology states its read-once instruction in its
description alone.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The suite op said three times what foreground-only says once: in its
Capability, in its Protocol, and by name from the rule itself.

- Capability names the verdict the op yields, not the shells it opens.
  Where an op runs is the group contract's; what it contributes is
  Capability's.
- Protocol keeps the concurrency, which is this op's own contribution,
  and drops the foreground framing and the do-not-background prohibition
  the reader already receives by container merge. The bound on peak
  memory stays, since that is why concurrency is safe here; the
  composition of a per-op budget goes, since resource-budget holds it.
- foreground-only states its concurrency carve-out generally. Naming the
  one op that uses it made a group contract track a descendant, and the
  carve-out holds for any caller that opens several shells at once.
- The host fallback becomes a note under the instruction it qualifies.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A full canon walk over the branch surfaced six defects in what this
branch itself ships.

- prepare-workflow-branch composed create-worktree with component_name
  and host_repo_path, which that op no longer declares, and passed
  nothing for component_git_dir, which it now requires. The compose is a
  Protocol reference rather than an activity bind, so the binding guard
  cannot see it.
- The review-path findings gate offered an option to hold, where the
  review-mode transition routes to submit-for-review whatever is chosen
  and the option's effect matched raise-none's. Posting is already the
  user's at review-summary-approval.
- The findings-report guide and the conformance pass each carried the
  same detect criteria. The guide owns them; the pass names which rule a
  breach records against and applies the sections as written.
- The findings-report guide claimed an order another resource holds.
- The initiative-name rule carried its own justification.
- The strategic-review field list explained itself by comparison with
  its sibling reports.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@m2ux

m2ux commented Aug 8, 2026

Copy link
Copy Markdown
Owner Author

Companion host-repo change: #449 (draft) deletes the now-stale binding-fidelity triage entry for version-control::initialize-folder, whose initiative_name input gains a producer here.

It must land with the submodule pointer bump that carries this PR onto main, not before. Verified both ways in a provisioned worktree: with the pointer where main has it today the deletion leaves the finding untriaged and check:all fails; with the pointer at this branch head all 24 guards pass.

m2ux and others added 8 commits August 8, 2026 12:13
A renumber and four collisions found by sweeping the branch for mutual
contradiction.

- The README seed's Progress inventory runs 1 to 33 contiguously. New
  rows take their place in the sequence rather than a letter suffix.
- The code review's method record is written by the activity that runs
  the review, so it takes that activity's prefix and sits under its rows.
- A report's severity is what the classification map yields. Requiring a
  render-scale member contradicted the map, which keeps Informational
  findings out of the summary tables and in the report, where they still
  need a value.
- A designator prefix is declared once, by the summary category that
  indexes the report. Each report guide names that category instead of
  repeating the token, which is the disagreement the prefix rule exists
  to prevent.
- Anchor resolution belongs to the link-integrity pass with the other
  three unresolved-link classes, rather than sitting beside the
  conformance checks as a fourth home for whether a link resolves.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
workflow-authoring and workflow-design each carried their own copy of
derive-workflows-target-path, deriving the same three paths from the same
planning folder by two slightly different routes. Both bind the meta
operation now.

The union keeps what each copy had alone: the checkout as a declared
output rather than a local, the note that the worktree's immediate
children are workflow directories and so it is what a guard's root takes,
and the declared planning-folder input. The design copy's third phase
restated the rule below it and is gone; the rule states it.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two unrelated repetitions, both resolved by moving a value to the place
that owns it.

The planning README's Progress inventory now runs in the order the
activities execute. Codebase comprehension sits third, between design
philosophy and requirements elicitation, which is where design-philosophy
transitions to it; its artifact prefix stays the highest of the set
because a prefix follows the definition file while a row follows the run.
The code review's method record moves into its own activity's block for
the same reason.

The cargo command prefix is a declared input. Ten invocations spelled out
the same environment caps and nice level, and the group rule spelled out
their composition an eleventh time. The container declares build_budget
with the compiling default; the two operations whose profile differs
declare their own, which is what a container input's override is for; and
the formatters carry nice alone, since a compile cap on a formatter
states a limit nothing spends.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two corrections to how the cargo budget was factored.

Defaults recreated what they removed. A default on the container plus one
on each operation whose profile differed put the same environment caps in
three places instead of ten. No operation declares a default now: the
group rule states the composition once, and each operation interpolates
build_budget.

The budget was a Substrate value dressed as a universal one. Suppressing
a runtime wasm build is a property of projects that build one, not of
running cargo, and baking it into every compiling operation forced a rule
on build-release explaining why it was the exception. build_budget is now
the caps and the nice level alone. Where a project compiles a second
product beside the binary, the operations suppress it and the operation
whose product it is builds it — stated once, as a condition on the
project rather than an assumption about it.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The three worktree operations declared component_git_dir although the
work-package root contract carries it. Each narrowed the wording to its
own use, so a caller bound against one description and a reader took
another. The leaf entries are gone; the merge delivers the slot and the
protocols reference it unchanged.

The catalog gains inherited-input-re-declared for the class. Its Rules
counterpart already existed as inherited-rules-re-enumerated, and the I/O
side had no entry: hoist-shared-inputs detects an input re-declared
across leaves INSTEAD of once on a container, which is the hoist not yet
done, and its carve-out for inputs on two or three leaves excuses exactly
the shape left behind when the hoist happens and the leaves are not
cleaned up. A sweep of every group finds the pattern on roughly seventy
leaves across fifteen groups, so the test transfers well beyond the
change that surfaced it.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adding an entry leaves the entries a walker reaches first unchanged, so
the walk that missed the defect still misses it.

hoist-shared-inputs is the entry an auditor lands on, and its carve-out
for inputs on two or three leaves is what excused this shape. The
carve-out now says what it counts — leaves whose common ancestor declares
none of them — and names where a leaf declaration beside an ancestor's
belongs instead. Its Fix says a hoist that leaves the leaf declarations
in place has not finished.

inherited-rules-re-enumerated names its I/O counterpart, so the pair is
navigable from either side.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SKIP_WASM_BUILD=1 stood at five call sites, which named a Substrate build
variable five times in a group that serves any cargo project.

generated_product_skip is the assignment that suppresses a project's
second build product, empty where it has none. The compiling operations
prefix it; build-release interpolates nothing, since the product is what
it exists to deliver. The Substrate value appears once, in the rule that
says what the designator holds and why.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The loader merges a container contract into every descendant, so a leaf
that declares the same id again adds no bind point. Where the leaf had
narrowed the wording to its own use, a caller bound against the
ancestor's contract and a reader took the leaf's, with nothing marking
which governed.

139 entries across 88 operations in 15 groups. Protocols reference the
same designators unchanged; the merge supplies them.

20 entries stay, each changing the bind contract rather than restating
it — a differing default, or an optionality the operation needs. That is
what a leaf declaration is for, and it is the carve-out
inherited-input-re-declared names.

Refs #446

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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