From 3adfcc9842a18904b7b723bfa36e5f2a319f5aef Mon Sep 17 00:00:00 2001 From: Mike Clay Date: Fri, 14 Aug 2026 06:14:36 +0100 Subject: [PATCH 1/2] Give the step-number rule one home MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ontology that defines what a Protocol is, and the anti-pattern catalog entry that detects citations by ordinal, each stated the same prohibition with its own reasoning beside it. The ontology now states the fact its own domain owns — the loader assigns step numbers, so a number is a position rather than an address — and the catalog entry cites it instead of deriving the same conclusion a second time. Detect, the carve-outs and the fix stay where they were. --- meta/resources/workflow-canonical.md | 5 +++-- workflow-design/resources/anti-patterns.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/meta/resources/workflow-canonical.md b/meta/resources/workflow-canonical.md index c0f3693d7..159eee912 100644 --- a/meta/resources/workflow-canonical.md +++ b/meta/resources/workflow-canonical.md @@ -52,8 +52,9 @@ Failure handling lives **inline in the protocol step that triggers it**. `## Protocol` is a **single ordered list of steps**. It may be a flat numbered/bulleted list, or `### N. Title` blocks each holding an ordered list. The server treats it as one ordered sequence and assigns step numbers at load time. -**Do not write absolute intra-protocol step-number references** ("go to step 3") — -composition and renumbering shift them; refer to steps descriptively. +A step number is therefore a position the loader assigns, not an address: +**do not write absolute intra-protocol step-number references** ("go to step 3"). +Refer to steps descriptively. ## Base-contract inheritance diff --git a/workflow-design/resources/anti-patterns.md b/workflow-design/resources/anti-patterns.md index 8e74d78ca..1d4336865 100644 --- a/workflow-design/resources/anti-patterns.md +++ b/workflow-design/resources/anti-patterns.md @@ -1787,7 +1787,7 @@ Protocol restates a tool parameter's shape, which the tool's own schema already A durable reference identifies a Protocol phase by its position, so it keeps resolving after a renumber and points at work it no longer names. -**Detect:** A rule, I/O description, Capability, resource body, README, or another technique's Protocol cites a phase of some `## Protocol` by ordinal — "step N", "phase N", "the Nth step" — rather than by the technique or op that owns it. An ordinal is not a symbol: it survives insertion, deletion and reordering by silently addressing whichever phase now holds that index, so the claim goes false with nothing failing. Test: insert one phase above the cited one and re-read the citing sentence; if it now names the wrong work, flag it. +**Detect:** A rule, I/O description, Capability, resource body, README, or another technique's Protocol cites a phase of some `## Protocol` by ordinal — "step N", "phase N", "the Nth step" — rather than by the technique or op that owns it. Step numbering belongs to the loader, per [workflow-canonical](../../meta/resources/workflow-canonical.md#protocol), so the citation survives insertion, deletion and reordering by silently addressing whichever phase now holds that index and goes false with nothing failing. Test: insert one phase above the cited one and re-read the citing sentence; if it now names the wrong work, flag it. **Do not flag:** Ordinals inside the same `## Protocol` that owns the numbering, where the phases and the reference move in one edit. A link to the phase's heading anchor, which fails a guard rather than drifting when the heading changes. Rules cited by dotted address — a rule name is not a position (`dotted-rule-address`). An ordinal that is part of a declared id, heading text, or quoted output rather than a citation. From 7f3dc74ced420b4fec63f4f8cd2c36433a71e0d8 Mon Sep 17 00:00:00 2001 From: Mike Clay Date: Fri, 14 Aug 2026 06:18:57 +0100 Subject: [PATCH 2/2] Classify the ontology's opening line as orientation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Citing the ontology by anchor brought it into the section-framing guard's scope for the first time: a resource delivered one section at a time strands whatever sits above its first heading. The line above that heading says which files the ontology governs, which a reader who asked for one section already knows — it names the resource, its subject and its reader, and nothing in it binds the work that section describes. Recorded as orientation. --- section-framing-triage.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/section-framing-triage.json b/section-framing-triage.json index 685ca13d3..f1ce99c55 100644 --- a/section-framing-triage.json +++ b/section-framing-triage.json @@ -45,6 +45,11 @@ "verdict": "harmless", "rationale": "orientation-only" }, + { + "site": "meta/resources/workflow-canonical.md", + "verdict": "harmless", + "rationale": "orientation-only" + }, { "site": "meta/resources/writing-register.md", "verdict": "harmless",