From bfbca92acb7e9cdc51ca325ef94f99ff223fbf08 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Wed, 11 Nov 2026 17:28:41 -0500 Subject: [PATCH 1/5] docs: pointers carry no as-of date or recheck trigger By the owner's decision of 2026-11-11, a pointer record is our decision plus a section-anchored pointer, with no as-of date and no recheck trigger. The per-PR and weekly link checks catch a dead link or moved anchor, whoever fetches the link reads its current content, and git history records when the line changed. A stored upstream value (a recorded default, limit, version gate, price, error string, or probe observation kept in a code constant, data file, table of measured values or observation record) keeps both, as the managed standard's "Time-bound external claims need a recheck trigger" requires. - upstream-drift contract 5.0.0 (major: a required part changes), with its CHANGELOG entry; every heading kept, stub title updated. - skill-bodies rule and its AGENTS.md index row (render-index.sh write). - Rule text in docs/review/skills-and-agents.md, native-references (3.6.0), authoring-formats (1.0.6), the playbooks model-adaptation conventions and skill criteria, and harness-config agents-md-liveness. Existing stamps are not swept here; tooling changes ship separately. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm --- ...pointers-without-stamps-policy-55846205.md | 9 + ...pointers-without-stamps-policy-554d9965.md | 9 + .../rules/skill-bodies-state-current-rules.md | 16 +- AGENTS.md | 2 +- docs/contracts/authoring-formats/CHANGELOG.md | 10 +- docs/contracts/authoring-formats/README.md | 8 +- docs/contracts/native-references/CHANGELOG.md | 11 ++ docs/contracts/native-references/README.md | 19 +- docs/contracts/upstream-drift/CHANGELOG.md | 19 ++ docs/contracts/upstream-drift/README.md | 172 +++++++++++------- docs/conventions/upstream-drift/README.md | 2 +- docs/plugin-philosophy.md | 2 +- docs/review/skills-and-agents.md | 5 +- .../reference/agents-md-liveness.md | 3 +- .../reference/model-adaptation/AGENTS.md | 2 +- .../reference/skill-criteria.md | 9 +- 16 files changed, 205 insertions(+), 93 deletions(-) create mode 100644 .changes/harness-config/docs-pointers-without-stamps-policy-55846205.md create mode 100644 .changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md diff --git a/.changes/harness-config/docs-pointers-without-stamps-policy-55846205.md b/.changes/harness-config/docs-pointers-without-stamps-policy-55846205.md new file mode 100644 index 00000000000..faf45d201e2 --- /dev/null +++ b/.changes/harness-config/docs-pointers-without-stamps-policy-55846205.md @@ -0,0 +1,9 @@ +--- +bump: patch +--- + +### Changed + +- The AGENTS.md liveness reference describes its record shape per upstream-drift 5.0.0: our + decision and a section-anchored pointer, with an as-of date and recheck trigger only where a + record keeps a stored value. Existing records are unchanged. diff --git a/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md b/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md new file mode 100644 index 00000000000..d1978e63343 --- /dev/null +++ b/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md @@ -0,0 +1,9 @@ +--- +bump: patch +--- + +### Changed + +- Skill criteria and the model-adaptation contributor conventions follow upstream-drift 5.0.0: a + pointer record is a section-anchored pointer with no as-of date or recheck trigger; only a + stored value, such as one of our own measurements, keeps both. Existing stamps are unchanged. diff --git a/.claude/rules/skill-bodies-state-current-rules.md b/.claude/rules/skill-bodies-state-current-rules.md index 258e23f3f94..69d0ed43bd3 100644 --- a/.claude/rules/skill-bodies-state-current-rules.md +++ b/.claude/rules/skill-bodies-state-current-rules.md @@ -1,5 +1,5 @@ --- -description: "Skill and agent bodies point at the live upstream source for any volatile specific instead of restating it, recorded as pointer, as-of date and recheck trigger, and name their successor in a `## Next` section; read before editing any skill body" +description: "Skill and agent bodies point at the live upstream source for any volatile specific instead of restating it, recorded as our decision plus a section-anchored pointer (an as-of date and recheck trigger only on a stored value), and name their successor in a `## Next` section; read before editing any skill body" paths: - "plugins/*/skills/**" - "plugins/*/agents/**" @@ -15,16 +15,22 @@ error string, schema or benchmark figure. The body states our decision in our ow name the topic, never what the page says about it) and records where to read the specific live, in the links-only record the [upstream-drift convention](../../docs/contracts/upstream-drift/README.md#required-parts) -defines: pointer to the exact section or issue, as-of date, recheck trigger. A body that needs the specific -at run time fetches it from the pointer. +defines: our decision and a pointer to the exact section or issue, with the situation in which to +fetch it where that helps. A pointer carries no as-of date and no recheck trigger: the link checks +catch a dead link or moved anchor, and whoever fetches the link reads its current content. A body +that needs the specific at run time fetches it from the pointer. + +A stored upstream value (a recorded default, limit, version gate, price, error string, or probe +observation, kept in a code constant, data file, table of measured values or observation record) +keeps an as-of date and a recheck trigger, because the value itself goes stale. A record never cures a restatement: restated text with an as-of stamp or `Claim/Basis` block beside it is still the defect, fixed by deleting the restated value and keeping the pointer. Older `Claim/Basis` records in nearby files are not precedent (#5684 converts them). The record is also defective when a docs-page pointer lacks the section anchor (an upstream issue or probe needs none), a blog post is the pointer where a docs section covers the topic (it goes beside the -pointer as a "correlate with" note), a probe observation names no probe, or the as-of date or -trigger is missing. +pointer as a "correlate with" note), a probe observation names no probe, or a stored value lacks +its as-of date or trigger. ## Successor sections diff --git a/AGENTS.md b/AGENTS.md index 84403db96b9..36459ee95ca 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -180,7 +180,7 @@ already in context, read the file directly. | `.claude/rules/eval-case-transcripts.md` | `plugins/*/evals/**, plugins/*/skills/*/evals/**` | Eval cases in this public repository never hold a raw session or product transcript; a one-to-one rewrite with every identifying detail changed is allowed after the identifying-details review | | `.claude/rules/mod-authoring.md` | `plugins/*/hooks/**` | Mods: before adding or changing a hooks module, load the built-in `plugin-authoring` skill and follow the mod-authoring convention, which points at the upstream mods pages and ADR 0052 | | `.claude/rules/ruff-pin.md` | `**/*.py` | Python linting runs through the pinned ruff wrapper, never a bare ruff on PATH | -| `.claude/rules/skill-bodies-state-current-rules.md` | `plugins/*/skills/**, plugins/*/agents/**` | Skill and agent bodies point at the live upstream source for any volatile specific instead of restating it, recorded as pointer, as-of date and recheck trigger, and name their successor in a `## Next` section; read before editing any skill body | +| `.claude/rules/skill-bodies-state-current-rules.md` | `plugins/*/skills/**, plugins/*/agents/**` | Skill and agent bodies point at the live upstream source for any volatile specific instead of restating it, recorded as our decision plus a section-anchored pointer (an as-of date and recheck trigger only on a stored value), and name their successor in a `## Next` section; read before editing any skill body | | `plugins/attribution/skills/audit/AGENTS.md` | `plugins/attribution/skills/audit/**` | Editing the attribution audit skill: contributor conventions | | `plugins/autonomy/AGENTS.md` | `plugins/autonomy/**` | autonomy plugin: contributor conventions | | `plugins/machine-health/skills/audit/AGENTS.md` | `plugins/machine-health/skills/audit/**` | machine-health audit skill: contributor conventions | diff --git a/docs/contracts/authoring-formats/CHANGELOG.md b/docs/contracts/authoring-formats/CHANGELOG.md index df4a1ccce26..1e81f30be8e 100644 --- a/docs/contracts/authoring-formats/CHANGELOG.md +++ b/docs/contracts/authoring-formats/CHANGELOG.md @@ -4,7 +4,15 @@ Notable changes to the authoring-formats contract. Per the README's Versioning s key, removing an allowed value, or changing a default is a major change; adding a key or an allowed value is minor; clarification is a patch. A recheck of the Mermaid-C4 record lands here only when it produces a drift outcome; refreshing the record's as-of date with no verdict change is no entry -and no version bump, per the upstream-drift contract's four-part-record rule. +and no version bump, per the upstream-drift contract's "When a trigger fires". + +## [1.0.6] - 2026-11-11 + +Clarification. No key, allowed value, or default changes. + +- **Record shape follows upstream-drift 5.0.0.** The Boundary and C4 dialect surfaces sections no + longer name a four-part record: the upstream-drift contract now requires an as-of date and recheck + trigger only on a stored value, and the Mermaid-C4 record's named trigger is unchanged. ## [1.0.5] - 2026-11-04 diff --git a/docs/contracts/authoring-formats/README.md b/docs/contracts/authoring-formats/README.md index 9cbaeaca1d3..15355cc5659 100644 --- a/docs/contracts/authoring-formats/README.md +++ b/docs/contracts/authoring-formats/README.md @@ -24,9 +24,9 @@ It does not own: layers exist, how they merge, the pointer-line grammar that binds a consumer's convention home, and the expression doctrine that puts this surface in convention-doc form rather than a dedicated file. -- **The stamp shape on the upstream fact below.** - [`upstream-drift`](../upstream-drift/README.md) owns the four required parts of a record and the - observability bar its recheck trigger must clear. +- **The record shape for the upstream-dependent decision below.** + [`upstream-drift`](../upstream-drift/README.md) owns the required parts of a record and the + observability bar a recheck trigger must clear. - **Diagram craft.** Nothing here teaches a dialect. A skill emitting one cites installed craft guidance presence-gated, or emits the plainest correct form of the dialect it was told to use. @@ -131,7 +131,7 @@ already emits; it does not add a new deliverable. The system key refuses mermaid for the reasons in [Why mermaid is not offered for the system key](#why-mermaid-is-not-offered-for-the-system-key). That refusal is not a claim that mermaid is unfit for the landscape surface, whose allowed set is -`structurizr | mermaid`. The four-part record in that section is the single recheck trigger for +`structurizr | mermaid`. The record in that section is the single recheck trigger for both surfaces: when it fires, re-derive the system-key allowed set, whether the landscape key's mermaid default should change, and whether the landscape emitter's mermaid output should use a dedicated landscape type. diff --git a/docs/contracts/native-references/CHANGELOG.md b/docs/contracts/native-references/CHANGELOG.md index b47d9273564..97b0c15aa08 100644 --- a/docs/contracts/native-references/CHANGELOG.md +++ b/docs/contracts/native-references/CHANGELOG.md @@ -6,6 +6,17 @@ major change; additive guidance is minor; clarification is a patch. The doc ship unnumbered, which this file reads as **1.0**; the entry below is the first recorded change and lands the changelog the README said would arrive with it. +## [3.6.0] - 2026-11-11 + +Minor: guidance change. No required part of the description phrase, no canonical gate token and no +enforceability verdict changes. + +- **Boundary reference records follow upstream-drift 5.0.0.** A record in a skill's Boundary + reference file, a suggest sentence's basis record, and the Boundary section's sixth property now + carry our decision and a section-anchored pointer; an as-of date and recheck trigger only where a + row keeps a stored value. The table form for a pointer row is `| Decision | Pointer |`. Overlap + store rows keep their recheck triggers: they are structured stored values. + ## [3.5.0] - 2026-11-11 Minor: guidance change. No required part of the description phrase, no canonical gate token and no diff --git a/docs/contracts/native-references/README.md b/docs/contracts/native-references/README.md index fc3a6c850ea..15b3420d924 100644 --- a/docs/contracts/native-references/README.md +++ b/docs/contracts/native-references/README.md @@ -22,9 +22,9 @@ This doc owns the phrasing of references **to native surfaces**. It does not own committed overlap store rendered into [`docs/native-surfaces.md`](../../native-surfaces.md). This doc governs the words once a verdict says a reference is warranted. - **The record behind any upstream specific a reference depends on.** - [`upstream-drift`](../upstream-drift/README.md) owns its shape (our decision, a pointer to the - exact upstream section, the as-of date, the recheck trigger) and the observability bar its - triggers must clear. + [`upstream-drift`](../upstream-drift/README.md) owns its shape (our decision and a pointer to + the exact upstream section; an as-of date and recheck trigger only on a stored value) and the + observability bar a trigger must clear. - **Instruction economy.** [`plugin-philosophy`](../../plugin-philosophy.md) owns the rule that every always-loaded description is a per-session tax. This doc keeps the phrase to one clause because of that rule; it does not restate it. @@ -139,9 +139,10 @@ earns (below) has no reason to hold the section back. The section carries the conclusion: the surfaces by provenance class, the routing split, and the mutation gate. The records behind it live in a **reference file inside the same skill**, linked from the section with a same-plugin relative path, so the body stays short and the detail stays -reachable. That file holds our decision in our words, a pointer to the exact upstream section, the -as-of date and the recheck trigger, and no upstream text; a table form uses the header -`| Decision | Pointer | As of | Recheck when |`. Existing `native-*` and `bundled-*` reference +reachable. That file holds our decision in our words and a pointer to the exact upstream section, +and no upstream text; a table form uses the header `| Decision | Pointer |`. A row that keeps a +stored value (a probed behavior, a recorded default) adds the as-of date and recheck trigger, in a +table as `| Decision | Pointer | As of | Recheck when |`. Existing `native-*` and `bundled-*` reference files keep the older four-part shape until [#5684](https://github.com/melodic-software/claude-code-plugins/issues/5684) converts them. Modeled on the `review` plugin's organic pattern (`/review:quality-gate` and `/review:fanout` each carry one): @@ -179,8 +180,8 @@ Six properties the section keeps: phrase. Cross-plugin pointers are forbidden. 5. **Presence-gated language throughout**: the body inherits the description's gate; it never promotes a surface to available because the body is longer. -6. **Upstream specifics are pointed at, never restated**: each carries a pointer, an as-of date - and a recheck trigger, per [`upstream-drift`](../upstream-drift/README.md). +6. **Upstream specifics are pointed at, never restated**: each carries a section-anchored + pointer, per [`upstream-drift`](../upstream-drift/README.md). ## Self-containment: shipped plugins never cite the registry @@ -314,7 +315,7 @@ If / is available in your session (), run it for . ``` `` names the surface's own gate and links a same-file upstream-drift record for it (our -decision, a pointer to the section defining the gate, the as-of date, the recheck trigger). For +decision and a pointer to the section defining the gate). For `/doctor` the basis names `DISABLE_DOCTOR_COMMAND` or a `skillOverrides` entry and not `disableBundledSkills`; for every other bundled skill it names `disableBundledSkills` as well. Place the sentence at the start of the run when the surface covers everything the skill does, and at the end when coverage is partial. A diff --git a/docs/contracts/upstream-drift/CHANGELOG.md b/docs/contracts/upstream-drift/CHANGELOG.md index 1542d0c26c6..28c87e408d1 100644 --- a/docs/contracts/upstream-drift/CHANGELOG.md +++ b/docs/contracts/upstream-drift/CHANGELOG.md @@ -4,6 +4,25 @@ Notable changes to the upstream-drift contract (SemVer). Changing a required par name, or an enforceability verdict is a major bump; additive guidance is a minor bump; docs-only clarification is a patch. +## [5.0.0] - 2026-11-11 + +Major: a required part changes. A pointer record is now our decision plus a section-anchored +pointer, with no as-of date and no recheck trigger, by the owner's decision of 2026-11-11. The link +checks catch a dead link or moved anchor, whoever fetches the link reads its current content, and +git history records when the line changed. A stored value (a recorded default, limit, version +gate, price, error string, or probe observation kept in a code constant, data file, table of +measured values or observation record) keeps its as-of date and recheck trigger, which the org +standard's "Time-bound external claims need a recheck trigger" requires of a snapshot. + +- Title, intro, "A date is never authority" (three record kinds), "Required parts" (two shapes, + the stored-value one-line layout; probes, source conflicts and topics no docs page covers are stored + values), "The observability bar", "When a trigger fires" (a pointer never fires), the + Old-patterns and WebFetch examples, the git-pin wording, and "Why this name" follow the change. +- Enforceability: new rows for the link checks and for a stamp on a pointer; the stamp-trigger row + now names stored-value stamps. The verdicts on existing rows do not change. +- Adopters: rows naming stamps on pointers keep conforming in decision and pointer; existing stamps + are not swept in this release. + ## [4.3.0] - 2026-11-09 Additive guidance; minor under this contract's own rule. No required part, canonical name, or diff --git a/docs/contracts/upstream-drift/README.md b/docs/contracts/upstream-drift/README.md index 7a8749cdced..f8ccc4ddb38 100644 --- a/docs/contracts/upstream-drift/README.md +++ b/docs/contracts/upstream-drift/README.md @@ -1,4 +1,4 @@ -# Upstream drift: verification stamps and recheck triggers +# Upstream drift: pointers, stored values and recheck triggers ## Contents @@ -18,9 +18,11 @@ Owner doc for **how this repository records a fact or decision derived from a source it does not own**, whether an official doc page, an upstream issue thread, or a probed platform behavior, so the record -stays honest as the upstream moves. One name and one shape: our decision in our own words, a -**pointer** to the exact upstream section, an **as-of date**, and a **recheck trigger**, the stated -observable event that obliges re-deriving the record. The upstream text itself is never stored. +stays honest as the upstream moves. Two shapes. A **pointer record** is our decision in our own +words plus a **pointer** to the exact upstream section; it stores nothing that can go stale, so it +carries no date. A **stored value**, an upstream default, limit or observation we keep a copy of, +adds an **as-of date** and a **recheck trigger**, the stated observable event that obliges +re-deriving the value. The upstream text itself is never stored. The fleet previously practiced this in five-plus places under four names: "recheck triggers" ([hook-config-delivery](../hook-config-delivery/README.md)), "revisit triggers" @@ -58,36 +60,48 @@ here a date alone does not qualify; a trigger names an observable event (see [the observability bar](#the-observability-bar)). This narrows only what this repository accepts; the upstream form list is the org standard's to change. +The org rule's recheck trigger binds a recorded snapshot: an upstream default, version gate or +price kept in durable content. A pointer record keeps no snapshot; it is the standard's preferred +alternative, linking and fetching at read time, so it needs no trigger. A stored value is the +snapshot the rule names and keeps its trigger. + ## A date is never authority -A dated verification stamp is an **as-of record**: it tells the reader when the decision was last -derived from its source, and nothing more. It never confers standing authority. A stale stamp reads identically -to a fresh one, and upstream surfaces move without notice: Claude Code changes its own conventions -between releases, sometimes with no version signal on the surface in question, and experimental -surfaces churn outright. The part of the record that matters is therefore the **trigger**, not the -date: anything depending on a volatile upstream specific carries a stated re-derivation event, or -it is drift waiting to happen. Before acting on any record, re-read the section its pointer names. -The as-of date is the ceiling on how current the decision can be, never a guarantee. +A dated verification stamp on a stored value is an **as-of record**: it tells the reader when the +value was last derived from its source, and nothing more. It never confers standing authority. A +stale stamp reads identically to a fresh one, and upstream surfaces move without notice: Claude +Code changes its own conventions between releases, sometimes with no version signal on the surface +in question, and experimental surfaces churn outright. The part of the record that matters is +therefore the **trigger**, not the date: a stored copy of a volatile upstream specific carries a +stated re-derivation event, or it is drift waiting to happen. The as-of date is the ceiling on how +current the value can be, never a guarantee. + +A pointer record carries no date because it stores nothing for a date to describe: the reader +fetches the section live and reads what it says now. Before acting on any record, re-read the +section its pointer names. Git history records when a pointer line last changed. -The discipline covers two record kinds, one shape: +The discipline covers three record kinds: - a **dependent decision**: something this repository does because of an upstream specific, with - the pointer saying where that specific lives; -- a **recorded decision**: a deferral or rejection derived from upstream facts as they stood on a - date, whose premises can rot the same way the facts can. + the pointer saying where that specific lives; a pointer record; +- a **recorded decision**: a deferral or rejection derived from upstream facts, whose premises can + rot the same way the facts can; it carries a pointer for each premise, and a named trigger when + the decision should be re-derived on an observable event ([When a trigger fires](#when-a-trigger-fires)); +- a **stored value**: a recorded default, limit, version gate, price, error string, or measured + probe observation, kept in a code constant, a data file, a table of measured values or an + observation record; it carries a pointer (or names its probe), an as-of date and a recheck + trigger. ## Required parts A conforming record stores no upstream text, quoted or paraphrased, not even one line (the one named exception is [old-patterns mapping tables](#old-patterns-mapping-tables)). What a `docs/upstream/` row may describe in our own words is in -[what a row may describe](#what-a-row-may-describe). It carries: +[what a row may describe](#what-a-row-may-describe). A pointer record carries: ```markdown - **Pointer**: when , fetch live. -- **As of**: YYYY-MM-DD -- **Recheck trigger**: ``` 1. **The decision**: what this repository does or decided, in our own words. It may name the topic @@ -95,31 +109,51 @@ named exception is [old-patterns mapping tables](#old-patterns-mapping-tables)). 2. **The pointer**: the official page URL with the anchor of the exact section, or the upstream issue. A reader who needs the specific reads it there, live. A blog post is never the pointer where a main docs section covers the topic: it appears only as a "correlate with \" - note beside that pointer. Where no docs page covers it yet, the record links the post as that - note, says no docs page covers the topic as of the date, and its recheck trigger is a docs page - starting to cover it, at which point the pointer moves there. In the one-line layout, that - correlate note may take the Pointer line's place, keeping the **Pointer** label and the - when-fetch wording and ending `no docs page covers as of `. -3. **The as-of date**: when the decision was last derived from the page. -4. **The recheck trigger**: the observable event that obliges re-derivation. + note beside that pointer. + +A pointer carries no as-of date and no recheck trigger. A dead link or a moved anchor is caught by +the link checks: `pr-require-checks.yml` checks local anchors and the external links a pull request +adds or changes, and `maintenance-check-links-online-claude-code-plugins.yml` checks every external +link weekly, anchors included except the script-rendered ones `lychee.toml` rewrites. Changed +content is seen by whoever fetches the link, and git history records when the line changed. + +A **stored value** keeps a copy, so it adds two parts: + +```markdown + +- **Pointer**: when , fetch live. +- **As of**: YYYY-MM-DD +- **Recheck trigger**: +``` + +1. **The as-of date**: when the value was last derived from its source. +2. **The recheck trigger**: the observable event that obliges re-derivation. + +A structured store (a data file, a code constant, a table with an **As of** column) may hold the +same parts as fields or columns. This Pointer form is **context glue**: it names the situation in which a reader needs the upstream section and sends them to read it live, and a record that uses it is a context-glue record. New records use it. A Pointer in the earlier form, `for , see .`, still conforms. -The parts may also sit on one line under the decision prose, and that layout conforms too: +A stored value's parts may also sit on one line under its prose, and that layout conforms too: ```markdown - **Pointer**: when , fetch live. **As of**: YYYY-MM-DD. **Recheck trigger**: . ``` -Two cases have their own form: +Three cases are observations, so they are stored values with their own form: - **A probed behavior** has no upstream page. The pointer names the probe (the script, pull request or issue holding its evidence), and the decision may state what the probe observed, in our words: the observation is ours, not the upstream's. - **A source conflict** is recorded only as "pages X and Y disagree on topic T", with both links, the as-of date and a trigger. Neither page's position is restated. +- **A topic no docs page covers yet.** The record links the blog post as the correlate note, says + no docs page covers the topic as of the date, and its recheck trigger is a docs page starting to + cover it, at which point the pointer moves there and the stamp goes. In the one-line layout the + correlate note may take the Pointer line's place, keeping the **Pointer** label and the + when-fetch wording and ending `no docs page covers as of `. When a surface needs the specific at run time, it fetches it from the pointer ([the fetch route](#reading-the-basis-the-fetch-route)). A catalog row that must fire without a @@ -130,16 +164,17 @@ live fetch keeps its firing rule in our own words; the rule is our decision, not One named exception admits upstream names into a file. A skill may carry a table mapping old API or interface names to their current ones, but only inside an "Old patterns" section placed where the skill-authoring guidance recommends one. The table holds names only, never descriptions of -behavior, and the section carries the record parts below it. Everywhere else the rule above holds. +behavior, and the section carries a pointer record below it. Everywhere else the rule above holds. -- **Pointer**: for where the guidance recommends an "Old patterns" section, see - . -- **As of**: 2026-10-01 -- **Recheck trigger**: that section stops recommending an "Old patterns" section, or moves. +- **Pointer**: when deciding where an "Old patterns" section goes, fetch + + live. ## The observability bar -A trigger names an event whose firing a reader, human or agent, can decide from evidence: a +The bar applies to a stored value's recheck trigger and to a named trigger guarding a decision; a +pointer record has no trigger. A trigger names an event whose firing a reader, human or agent, can +decide from evidence: a release or changelog entry touching a named surface, an upstream issue changing state, a capability shipping or leaving an experimental key, a second consumer appearing, a recurring occasion such as each fleet audit. "Periodically", "when things change", or an unstated intention to revisit do not @@ -147,20 +182,22 @@ qualify: a trigger whose firing cannot be checked is only a date. ## When a trigger fires -A firing is a record-maintenance event, and the procedure follows what the trigger guards: - -- **A pointer record.** Re-read the section the pointer names and re-derive the decision from what - is actually there, never patching the record from memory. A section that moved gets a new - pointer. Refresh the as-of date **with the outcome**, drift or no drift. On a versioned surface - a drift outcome lands as a changelog entry; refreshing a date with no verdict change is no entry - and no version bump. -- **A named trigger guarding an in-repo decision** ([Adopters](#adopters) says which rows these - are). There is no pointer to re-read and no as-of date to refresh: re-derive the decision - from the state the trigger names. The decision guarded is in-repo; the firing event can live - anywhere, upstream included. Record the outcome durably where the decision lives: the record - itself or the owning surface's changelog. A re-derivation that ends up depending on an upstream - specific adopts the required parts in the refreshed record. The durable outcome is the part - this kind shares with the pointer kind. +A firing is a record-maintenance event, and the procedure follows what the trigger guards. A +pointer record has no trigger and never fires: a link check failing on it is fixed by moving the +pointer to the section's new home, and a reader who finds the section no longer supports the +decision re-derives the decision then. + +- **A stored value.** Re-read the section the pointer names, or re-run the probe, and re-derive + the value from what is actually there, never patching the record from memory. A section that + moved gets a new pointer. Refresh the as-of date **with the outcome**, drift or no drift. On a + versioned surface a drift outcome lands as a changelog entry; refreshing a date with no verdict + change is no entry and no version bump. +- **A named trigger guarding a decision** ([Adopters](#adopters) says which rows these are). There + is no as-of date to refresh: re-derive the decision from the state the trigger names, reading + any pointer it carries. The firing event can live anywhere, upstream included. Record the + outcome durably where the decision lives: the record itself or the owning surface's changelog. + A re-derivation that ends up depending on an upstream specific adopts the required parts in the + refreshed record. The durable outcome is the part this kind shares with the stored-value kind. Whichever the kind, where re-derivation finds drift the changed value lands in the owning record, never silently in a consuming surface. @@ -169,10 +206,11 @@ never silently in a consuming surface. The standing rule to re-read a record's pointer before acting on it ([a date is never authority](#a-date-is-never-authority)) is per-use validation: it protects the -act, not the record, and a lookup that finds no drift obliges no edit anywhere. A record kept -current this way states divergence as its trigger, and "a read-time re-fetch finds the source no -longer matching the record" is an event decidable from evidence, so the divergence, never the -lookup, is what fires, and only a firing invokes the maintenance procedure above. +act, not the record, and a lookup that finds no drift obliges no edit anywhere. A pointer record +relies on this alone. A stored value kept current this way states divergence as its trigger, and +"a read-time re-fetch finds the source no longer matching the record" is an event decidable from +evidence, so the divergence, never the lookup, is what fires, and only a firing invokes the +maintenance procedure above. ## Reading the basis: the fetch route @@ -233,8 +271,6 @@ CHANGELOG capture below was, gets no note, so this routing rule, not the hook, c - **Pointer**: when deciding whether a WebFetch result can stand in for the page, fetch [tools reference: WebFetch tool behavior](https://code.claude.com/docs/en/tools-reference#webfetch-tool-behavior) live; it owns how WebFetch processes a page. -- **As of**: 2026-10-04 -- **Recheck trigger**: that section changes how WebFetch limits or processes a page. Probed behavior, measured 2026-10-04 against each page's full `.md` bytes: WebFetch stopped at about 100,000 characters of converted markdown, so the result covered about 40% of `hooks`, 61% of @@ -363,7 +399,7 @@ That changes one thing: a model-written note about a page is served only while e cites still hashes the same, so a note expires when its sections change and survives edits elsewhere on the page. -What stays **deferred** is a hash store for verification stamps. The cache is per machine, expires +What stays **deferred** is a hash store for stored-value stamps. The cache is per machine, expires by age and is pruned by size, and no stamp records the hash of the page it was derived from, so a changed hash in the cache says nothing about which stamps rest on that page. Every stamp recheck is still a manual re-fetch at trigger time. Recheck trigger for the deferral itself: a stale stamp causes a @@ -403,7 +439,8 @@ that records a docs site keeps its own forms; `docs/upstream/claude-code.md` kee The [required parts](#required-parts) still bind: a row may name a topic and link to it, and holds no upstream text, quoted or paraphrased; [what a row may describe](#what-a-row-may-describe) says -where our own description of a unit ends and a paraphrase begins. Two parts take a git-specific +where our own description of a unit ends and a paraphrase begins. A git-pinned page records what +we read at a commit, so it is a stored value, and its two stored-value parts take a git-specific shape. The 40-hex pin stands in for the as-of date: the commit fixes exactly what was read, and the page's git history records when. And git blob SHAs are a content hash the host already serves, so the [content-hashing deferral](#drift-signal-content-hashing-deferred) does not apply to git @@ -506,9 +543,11 @@ Classified per `melodic-software/standards` `standards/engineering/enforceabilit | Judgment | Tier | |---|---| -| Every verification stamp carries a recheck trigger | **Deterministic** by nature (a presence check) once stamps and triggers use greppable forms. The check, flagging a dated stamp in a file that states no trigger, is **built, off by default, repo override enabled**: `/attribution:audit` runs it when `trigger_less_stamp_check` is true, the shipped default is false, and this repository sets it true in `docs/conventions/attribution.yaml`. It was built after its build trigger, a trigger-less stamp landing on `main` again, fired. | +| A pointer's link resolves and its section anchor exists | **Deterministic**, built: the per-PR and weekly link checks named under [required parts](#required-parts). An anchor a page renders by script is rewritten away by `lychee.toml`, so a moved anchor of that kind is caught only when a reader fetches it. | +| A pointer carries no as-of date or recheck trigger | **Detect-then-judge**, not built: a stamp beside a pointer is greppable, and whether the record keeps a stored value is a judgment. | +| Every stored-value stamp carries a recheck trigger | **Deterministic** by nature (a presence check) once stamps and triggers use greppable forms. The check, flagging a dated stamp in a file that states no trigger, is **built, off by default, repo override enabled**: `/attribution:audit` runs it when `trigger_less_stamp_check` is true, the shipped default is false, and this repository sets it true in `docs/conventions/attribution.yaml`. It was built after its build trigger, a trigger-less stamp landing on `main` again, fired. | | The trigger clears the observability bar | **Reasoning-only**. Whether an event is decidable from evidence is a judgment about meaning. | -| A trigger has fired | **Detect-then-judge** for [pinned git upstreams](#pinned-git-upstreams): `scripts/check-upstream-drift.sh` flags a change under a linked path or scope, and a person decides whether the change touches the decision, and for the Claude Code changelog record, where [the release intake lane](#claude-code-release-intake) takes in each unread release. **Reasoning-only** for every other record today; detect-then-judge there too if a hash store lands: the hash mismatch flags, and judgment decides whether the page change touches the claim, because a changed page is not a changed fact. | +| A trigger has fired | **Detect-then-judge** for [pinned git upstreams](#pinned-git-upstreams): `scripts/check-upstream-drift.sh` flags a change under a linked path or scope, and a person decides whether the change touches the decision, and for the Claude Code changelog record, where [the release intake lane](#claude-code-release-intake) takes in each unread release. **Reasoning-only** for every other stored value today; detect-then-judge there too if a hash store lands: the hash mismatch flags, and judgment decides whether the page change touches the claim, because a changed page is not a changed fact. | ### Recorded decision: an adoption gate is deferred, and the check named above would have missed the case that prompted it @@ -536,9 +575,9 @@ real signal into noise with an approved silencer. - **Pointer**: for the reasoning-only tier and the worth-mechanizing routing rule, see `melodic-software/standards` `standards/engineering/enforceability-tiers.md`; the worked - instance is above. -- **As of**: 2026-11-05, re-derived and upheld in [CHANGELOG 4.2.0](CHANGELOG.md) -- **Recheck trigger**: a third unstamped upstream-fact carrier reaches `main` after this decision + instance is above. Re-derived and upheld in [CHANGELOG 4.2.0](CHANGELOG.md). +- **Recheck trigger** (a named trigger on this decision): a third upstream-fact carrier with no + record reaches `main` after this decision (two are already on the record: `plugin-quality`, corrected in its 0.4.0, and `architecture`, whose false claim was removed in its 0.5.1), **or** a detector is demonstrated that separates an upstream restatement from an in-repo one without a suppression list. Either event reopens the @@ -576,7 +615,7 @@ note under the table already requires, and names the release that added it, so t implies a surface was migrated at 1.0.0 when it was not. **A surface is tabled only once it actually conforms.** The third column is a promise to a reader -about what they can rely on, so a carrier *known* to be unstamped belongs in a tracked issue, never +about what they can rely on, so a carrier *known* to lack its record belongs in a tracked issue, never in a row: tabling it would assert the very thing the reader would then not get. The fleet's open carriers are recorded that way in [#2297](https://github.com/melodic-software/claude-code-plugins/issues/2297). @@ -595,6 +634,12 @@ four-part shape are tracked in [#5684](https://github.com/melodic-software/claude-code-plugins/issues/5684) and adopt the new shape on touch. +At 5.0.0 a pointer record stopped carrying an as-of date and recheck trigger; only a stored value +keeps them. A row below that names an as-of date or a divergence trigger on a pointer still +conforms in its decision and pointer, and its stamps are removed by a later sweep or on touch. A +row describing measured or probed values (a verified version, a probe) describes stored values and +keeps its stamps. + | Surface | Was | What a reader can rely on | |---|---|---| | [hook-config-delivery](../hook-config-delivery/README.md) §Recheck triggers | already the canonical name | Conforming records: per-fact pointer, a per-row verified version and date, and fact-scoped event triggers. | @@ -619,7 +664,8 @@ wording they shipped with; a new ADR uses the canonical name going forward. ## Why this name "Recheck trigger" is what the org standard (`documentation-and-citations.md` §"Time-bound external -claims need a recheck trigger") already calls the concept. A repo-level owner doc renaming the +claims need a recheck trigger") already calls the concept, and it names the same thing there: the +re-derivation event on a stored snapshot. A repo-level owner doc renaming the rule it specializes would fork the vocabulary one level up. It is also the majority name in this fleet, and the `## Recheck triggers` heading is the one the docs-hygiene plugin's audit-noise section-exemption list already recognizes. diff --git a/docs/conventions/upstream-drift/README.md b/docs/conventions/upstream-drift/README.md index 35d668da6d8..7056bd600c7 100644 --- a/docs/conventions/upstream-drift/README.md +++ b/docs/conventions/upstream-drift/README.md @@ -1,4 +1,4 @@ -# Upstream drift: verification stamps and recheck triggers +# Upstream drift: pointers, stored values and recheck triggers This contract moved to [`docs/contracts/upstream-drift/`](../../contracts/upstream-drift/README.md). This page keeps its headings so links from installed plugin versions still reach each section. diff --git a/docs/plugin-philosophy.md b/docs/plugin-philosophy.md index a6e745772ad..d86bba9f43a 100644 --- a/docs/plugin-philosophy.md +++ b/docs/plugin-philosophy.md @@ -948,7 +948,7 @@ doc before a second plugin adopts it. Fleet audits check conformance per row. | Liveness assertion (false-green / healthy-while-dead surfaces) | [`docs/contracts/liveness-assertion/`](contracts/liveness-assertion/README.md) | | Detector findings (non-fanout producers reaching the apply relay) | [`docs/contracts/detector-findings/`](contracts/detector-findings/README.md) | | Fresh-eyes declaration pattern contract | `/skill-quality:check`, which owns and enforces the declaration spec | -| Upstream-drift verification stamps and recheck triggers | [`docs/contracts/upstream-drift/`](contracts/upstream-drift/README.md) | +| Upstream-drift pointers, stored values and recheck triggers | [`docs/contracts/upstream-drift/`](contracts/upstream-drift/README.md) | | Windows path emission across the Git Bash → native boundary | [`docs/contracts/windows-path-emit/`](contracts/windows-path-emit/README.md) | | Pre-PR step order (where outcome verification sits) | [`docs/contracts/pre-pr-ordering/`](contracts/pre-pr-ordering/README.md) | | Mod authoring: pointers at the upstream mods pages, mod versus settings hook, packaging, version floor, facts upstream does not state | [`docs/contracts/mod-authoring/`](contracts/mod-authoring/README.md) | diff --git a/docs/review/skills-and-agents.md b/docs/review/skills-and-agents.md index af3fc706974..21b06ae8b4f 100644 --- a/docs/review/skills-and-agents.md +++ b/docs/review/skills-and-agents.md @@ -1,8 +1,9 @@ # Skills and agents - Skill and agent bodies never restate a volatile upstream specific (behavior, limit, default, - version), even with a stamp; they point at the exact section, and the pointer carries an as-of - date and recheck trigger: [rule](../../.claude/rules/skill-bodies-state-current-rules.md). + version), even with a stamp; they point at the exact section, and the pointer carries no as-of + date or recheck trigger (a stored value keeps both): + [rule](../../.claude/rules/skill-bodies-state-current-rules.md). - Skill and agent text meets the skill standard, and a cut to an existing skill ships only with eval evidence of no loss, except a restated upstream fact swapped for a pointer: [skill criteria](../../plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md). A PR diff --git a/plugins/harness-config/reference/agents-md-liveness.md b/plugins/harness-config/reference/agents-md-liveness.md index 0e81d800146..6a951768a2e 100644 --- a/plugins/harness-config/reference/agents-md-liveness.md +++ b/plugins/harness-config/reference/agents-md-liveness.md @@ -5,7 +5,8 @@ on two questions, in this order: is `AGENTS.md` support **available** in the ses so, which files does the **Project instructions** setting load. Both are recorded here in the shape the [upstream-drift convention](../../../docs/contracts/upstream-drift/README.md#required-parts) -defines: our decision, a pointer to the upstream section, the as-of date, the recheck trigger. +defines: our decision and a pointer to the upstream section; an as-of date and recheck trigger +only where a record keeps a stored value. **Why the record lives here.** A plugin never imports files from a sibling plugin ([plugin philosophy](../../../docs/plugin-philosophy.md), "It never imports files from a sibling diff --git a/plugins/playbooks/reference/model-adaptation/AGENTS.md b/plugins/playbooks/reference/model-adaptation/AGENTS.md index b6be66e3cec..287a449268e 100644 --- a/plugins/playbooks/reference/model-adaptation/AGENTS.md +++ b/plugins/playbooks/reference/model-adaptation/AGENTS.md @@ -6,7 +6,7 @@ A chapter stores no text from Anthropic's prompting guides, system cards or blog paraphrased. It states what this repository does differently on that model, in our own words, and points at the exact upstream section for the reason, in the record shape the [upstream-drift convention](../../../../docs/contracts/upstream-drift/README.md#required-parts) -defines: pointer, as-of date, recheck trigger. +defines: a section-anchored pointer, with no as-of date or recheck trigger. Tested phrasing, such as a guide's effort steers or a length-calibration sentence, is not copied into a chapter even where rewording might weaken it. The chapter names the trigger for using it diff --git a/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md b/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md index 32466b62203..b63923c4495 100644 --- a/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md +++ b/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md @@ -5,8 +5,7 @@ The house standard for writing a skill or a plugin agent in this marketplace. Ci Precedence: official Anthropic guidance wins. Where it is silent, follow the concise style of Pocock's skills. Upstream-owned specifics (caps, defaults, listing behavior) are never restated -here: read them live from the pointers [Sources](#sources) holds, each with its as-of date and -recheck trigger. Where a cap is enforced, `/skill-quality:check` enforces it and its script holds +here: read them live from the pointers [Sources](#sources) holds. Where a cap is enforced, `/skill-quality:check` enforces it and its script holds the constant. Figures this page does state are our own measurements, dated. A house setting is named as one: a `/skill-quality:check` setting, or a choice of this page's protocol. @@ -225,7 +224,8 @@ reads it. A key nothing reads is cut. - No PR or issue numbers, "added in" notes, incident narratives or date-conditional guidance in a skill. Git, the CHANGELOG, issues and ADRs hold history. -- Exempt: pointer records (pointer, as-of date, recheck trigger, per the +- Exempt: upstream-drift records (a section-anchored pointer, plus an as-of date and recheck + trigger on a stored value, per the [upstream-drift convention](https://github.com/melodic-software/claude-code-plugins/blob/main/docs/contracts/upstream-drift/README.md#required-parts)) and cross-repo `owner/repo#N` pointers to an upstream bug. - A skill whose users still meet renamed names may keep a names-only "Old patterns" table, within @@ -351,7 +351,8 @@ the reviewer's reading list for the rest. ## Sources -Each record: pointer, as-of date, recheck trigger. Re-read the pointer before acting on a figure. +Each record is a section-anchored pointer; a record of our own measurement adds its as-of date and +recheck trigger. Re-read the pointer before acting on a figure. - **Claude Code skills docs**: listing cap and budget at [Skill descriptions are cut short](https://code.claude.com/docs/en/skills#skill-descriptions-are-cut-short); From 4ed0e9072752e0273f2ed0e1117a4c02665cbd5e Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Wed, 11 Nov 2026 17:34:57 -0500 Subject: [PATCH 2/5] fix: let tooling accept pointer records without as-of stamps A pointer to an upstream section no longer carries an as-of date or a recheck trigger; only a stored upstream value (a recorded default, limit, version gate, price, error string or measured observation) keeps them. The tooling still assumed every pointer record was stamped: - skill-quality check 29 and harness-config I40 exempted a bare #N only inside a stamped block. Both now also exempt a bare #N whose block cites the same number upstream (owner/repo#N or an /issues/N or /pull/N URL), and keep the stamped-block exemption for stored values. New tests fail on the old scripts and pass now. - sync-plugin-options-docs.py wrote "As of ... Recheck trigger:" under the README options block's Upstream documentation list, which is links only (pointers). The stamp is dropped and every README regenerated; check-data-root.test.sh asserts its absence and drops the trigger-less stamp check whose subject is gone. - instruction-placement remove-shims.sh ended the printed price at a "- **As of**" line; it now ends where the pointer bullet ends, with a test for an unstamped record. - Prompts and rubrics that asked for a stamp on a pointer: multi-agent drift-audit repo mode (copied-current), attribution rubric carve-out and condense-to-stamped-record parts, docs-hygiene audit-derivability drift control, harness-ops changelog correct lens. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm --- ...records-without-stamps-tooling-c9d53472.md | 7 +++++ ...records-without-stamps-tooling-2d9d89d3.md | 7 +++++ ...records-without-stamps-tooling-88b9454f.md | 7 +++++ ...records-without-stamps-tooling-f131f5a7.md | 7 +++++ ...records-without-stamps-tooling-779810f0.md | 7 +++++ ...records-without-stamps-tooling-39b83c33.md | 7 +++++ ...records-without-stamps-tooling-0a59411b.md | 7 +++++ ...records-without-stamps-tooling-8a65769b.md | 7 +++++ ...records-without-stamps-tooling-2181447b.md | 7 +++++ ...records-without-stamps-tooling-0a48c863.md | 7 +++++ ...records-without-stamps-tooling-12c20731.md | 7 +++++ ...records-without-stamps-tooling-a910a962.md | 7 +++++ ...records-without-stamps-tooling-95f70a9f.md | 7 +++++ ...records-without-stamps-tooling-c24f8051.md | 7 +++++ ...records-without-stamps-tooling-834d5587.md | 7 +++++ ...records-without-stamps-tooling-0f63d284.md | 7 +++++ ...records-without-stamps-tooling-f7e3d2b1.md | 7 +++++ ...records-without-stamps-tooling-267957a2.md | 7 +++++ ...records-without-stamps-tooling-1c6b54e6.md | 7 +++++ ...records-without-stamps-tooling-0a71978c.md | 7 +++++ ...records-without-stamps-tooling-c7c334e2.md | 7 +++++ ...records-without-stamps-tooling-62a42007.md | 8 +++++ ...records-without-stamps-tooling-6759e80c.md | 7 +++++ ...records-without-stamps-tooling-21b05b90.md | 7 +++++ ...records-without-stamps-tooling-406f8f30.md | 7 +++++ ...records-without-stamps-tooling-550c66d1.md | 7 +++++ ...records-without-stamps-tooling-5d88d801.md | 7 +++++ ...records-without-stamps-tooling-0e91c91b.md | 7 +++++ ...records-without-stamps-tooling-6f288687.md | 7 +++++ ...records-without-stamps-tooling-36f2b868.md | 7 +++++ ...records-without-stamps-tooling-d56b7d3e.md | 11 +++++++ ...records-without-stamps-tooling-f23a1a9a.md | 8 +++++ ...records-without-stamps-tooling-89e23491.md | 7 +++++ ...records-without-stamps-tooling-811656a8.md | 11 +++++++ ...records-without-stamps-tooling-22b763a6.md | 7 +++++ ...records-without-stamps-tooling-09d7a882.md | 7 +++++ ...records-without-stamps-tooling-f9c31b1c.md | 7 +++++ ...records-without-stamps-tooling-d4683e03.md | 7 +++++ ...records-without-stamps-tooling-1e445c2e.md | 7 +++++ ...records-without-stamps-tooling-4b26d986.md | 7 +++++ ...records-without-stamps-tooling-152a381f.md | 7 +++++ ...records-without-stamps-tooling-d6056761.md | 7 +++++ ...records-without-stamps-tooling-6e092b7a.md | 7 +++++ ...records-without-stamps-tooling-b010511d.md | 7 +++++ ...records-without-stamps-tooling-8d3d96d1.md | 7 +++++ ...records-without-stamps-tooling-598b9087.md | 7 +++++ ...records-without-stamps-tooling-231046b1.md | 7 +++++ ...records-without-stamps-tooling-0f25923f.md | 7 +++++ ...records-without-stamps-tooling-34e24f14.md | 7 +++++ ...records-without-stamps-tooling-d9224283.md | 7 +++++ ...records-without-stamps-tooling-090664b4.md | 11 +++++++ ...records-without-stamps-tooling-b59c85b8.md | 7 +++++ ...records-without-stamps-tooling-619957b2.md | 7 +++++ ...records-without-stamps-tooling-6408f323.md | 7 +++++ ...records-without-stamps-tooling-0306194e.md | 7 +++++ ...records-without-stamps-tooling-2f098196.md | 7 +++++ ...records-without-stamps-tooling-62d50d46.md | 7 +++++ ...records-without-stamps-tooling-f579a056.md | 7 +++++ ...records-without-stamps-tooling-a08b1002.md | 7 +++++ ...records-without-stamps-tooling-515a3777.md | 7 +++++ plugins/actionlint/README.md | 3 -- plugins/adhd/README.md | 3 -- plugins/ai-briefing/README.md | 3 -- plugins/animation/README.md | 3 -- plugins/architecture/README.md | 3 -- .../skills/audit/reference/dispositions.md | 20 ++++++++----- .../skills/audit/reference/rubric.md | 15 ++++++---- plugins/autonomy/README.md | 3 -- plugins/bash-format/README.md | 3 -- plugins/biome-format/README.md | 3 -- plugins/bugs/README.md | 3 -- plugins/code-tidying/README.md | 3 -- plugins/codebase-health/README.md | 3 -- plugins/context-budget/README.md | 3 -- plugins/context-guard/README.md | 3 -- plugins/corrections/README.md | 3 -- plugins/debugging/README.md | 3 -- plugins/desktop-notification/README.md | 3 -- plugins/discipline/README.md | 3 -- plugins/discovery/README.md | 3 -- plugins/disk-hygiene/README.md | 3 -- plugins/display-redaction/README.md | 3 -- plugins/docs-hygiene/README.md | 3 -- .../skills/audit-derivability/SKILL.md | 2 +- .../audit-derivability/context/rubric.md | 6 ++++ plugins/domain-driven-design/README.md | 3 -- plugins/education/README.md | 3 -- plugins/eol-normalizer/README.md | 3 -- plugins/evals/README.md | 3 -- plugins/gaming/README.md | 3 -- plugins/github/README.md | 3 -- plugins/go-format/README.md | 3 -- plugins/guardrails/README.md | 3 -- plugins/harness-config/README.md | 3 -- .../audit-instructions/reference/criteria.md | 10 ++++--- .../scripts/instruction-scan.sh | 30 ++++++++++++++----- .../scripts/instruction-scan.test.sh | 16 ++++++++-- plugins/harness-ops/README.md | 3 -- .../context/classification-rubric.md | 2 +- plugins/implementation/README.md | 3 -- plugins/instruction-placement/README.md | 3 -- .../skills/migrate/reference/sources.md | 2 +- .../skills/migrate/scripts/remove-shims.sh | 9 +++--- .../migrate/scripts/remove-shims.test.sh | 23 +++++++++++++- plugins/knowledge/README.md | 3 -- plugins/machine-health/README.md | 3 -- plugins/markdown-format/README.md | 3 -- plugins/miro/README.md | 3 -- .../multi-agent/tests/drift-audit.test.mjs | 8 +++++ plugins/multi-agent/workflows/drift-audit.js | 12 ++++---- plugins/mutation-testing/README.md | 3 -- plugins/pixel-art/README.md | 3 -- plugins/planning/README.md | 3 -- plugins/playbooks/README.md | 3 -- plugins/playwright/README.md | 3 -- plugins/powershell-format/README.md | 3 -- plugins/rate-limit-guard/README.md | 3 -- plugins/repo-hygiene/README.md | 3 -- plugins/review/README.md | 3 -- plugins/ruff-format/README.md | 3 -- plugins/session-flow/README.md | 3 -- plugins/skill-quality/README.md | 9 +++--- plugins/skill-quality/scripts/check-skill.sh | 30 ++++++++++++++----- .../skill-quality/scripts/check-skill.test.sh | 9 ++++++ plugins/source-control/README.md | 3 -- plugins/speech/README.md | 3 -- plugins/testing/README.md | 3 -- plugins/toolchain/README.md | 3 -- plugins/typos-format/README.md | 3 -- plugins/user-interface/README.md | 3 -- plugins/verification/README.md | 3 -- plugins/visualization/README.md | 3 -- plugins/work-items/README.md | 3 -- scripts/check-data-root.test.sh | 19 ++---------- scripts/sync-plugin-options-docs.py | 4 --- 135 files changed, 587 insertions(+), 244 deletions(-) create mode 100644 .changes/actionlint/fix-pointer-records-without-stamps-tooling-c9d53472.md create mode 100644 .changes/adhd/fix-pointer-records-without-stamps-tooling-2d9d89d3.md create mode 100644 .changes/ai-briefing/fix-pointer-records-without-stamps-tooling-88b9454f.md create mode 100644 .changes/animation/fix-pointer-records-without-stamps-tooling-f131f5a7.md create mode 100644 .changes/architecture/fix-pointer-records-without-stamps-tooling-779810f0.md create mode 100644 .changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md create mode 100644 .changes/autonomy/fix-pointer-records-without-stamps-tooling-0a59411b.md create mode 100644 .changes/bash-format/fix-pointer-records-without-stamps-tooling-8a65769b.md create mode 100644 .changes/biome-format/fix-pointer-records-without-stamps-tooling-2181447b.md create mode 100644 .changes/bugs/fix-pointer-records-without-stamps-tooling-0a48c863.md create mode 100644 .changes/code-tidying/fix-pointer-records-without-stamps-tooling-12c20731.md create mode 100644 .changes/codebase-health/fix-pointer-records-without-stamps-tooling-a910a962.md create mode 100644 .changes/context-budget/fix-pointer-records-without-stamps-tooling-95f70a9f.md create mode 100644 .changes/context-guard/fix-pointer-records-without-stamps-tooling-c24f8051.md create mode 100644 .changes/corrections/fix-pointer-records-without-stamps-tooling-834d5587.md create mode 100644 .changes/debugging/fix-pointer-records-without-stamps-tooling-0f63d284.md create mode 100644 .changes/desktop-notification/fix-pointer-records-without-stamps-tooling-f7e3d2b1.md create mode 100644 .changes/discipline/fix-pointer-records-without-stamps-tooling-267957a2.md create mode 100644 .changes/discovery/fix-pointer-records-without-stamps-tooling-1c6b54e6.md create mode 100644 .changes/disk-hygiene/fix-pointer-records-without-stamps-tooling-0a71978c.md create mode 100644 .changes/display-redaction/fix-pointer-records-without-stamps-tooling-c7c334e2.md create mode 100644 .changes/docs-hygiene/fix-pointer-records-without-stamps-tooling-62a42007.md create mode 100644 .changes/domain-driven-design/fix-pointer-records-without-stamps-tooling-6759e80c.md create mode 100644 .changes/education/fix-pointer-records-without-stamps-tooling-21b05b90.md create mode 100644 .changes/eol-normalizer/fix-pointer-records-without-stamps-tooling-406f8f30.md create mode 100644 .changes/evals/fix-pointer-records-without-stamps-tooling-550c66d1.md create mode 100644 .changes/gaming/fix-pointer-records-without-stamps-tooling-5d88d801.md create mode 100644 .changes/github/fix-pointer-records-without-stamps-tooling-0e91c91b.md create mode 100644 .changes/go-format/fix-pointer-records-without-stamps-tooling-6f288687.md create mode 100644 .changes/guardrails/fix-pointer-records-without-stamps-tooling-36f2b868.md create mode 100644 .changes/harness-config/fix-pointer-records-without-stamps-tooling-d56b7d3e.md create mode 100644 .changes/harness-ops/fix-pointer-records-without-stamps-tooling-f23a1a9a.md create mode 100644 .changes/implementation/fix-pointer-records-without-stamps-tooling-89e23491.md create mode 100644 .changes/instruction-placement/fix-pointer-records-without-stamps-tooling-811656a8.md create mode 100644 .changes/knowledge/fix-pointer-records-without-stamps-tooling-22b763a6.md create mode 100644 .changes/machine-health/fix-pointer-records-without-stamps-tooling-09d7a882.md create mode 100644 .changes/markdown-format/fix-pointer-records-without-stamps-tooling-f9c31b1c.md create mode 100644 .changes/miro/fix-pointer-records-without-stamps-tooling-d4683e03.md create mode 100644 .changes/multi-agent/fix-pointer-records-without-stamps-tooling-1e445c2e.md create mode 100644 .changes/mutation-testing/fix-pointer-records-without-stamps-tooling-4b26d986.md create mode 100644 .changes/pixel-art/fix-pointer-records-without-stamps-tooling-152a381f.md create mode 100644 .changes/planning/fix-pointer-records-without-stamps-tooling-d6056761.md create mode 100644 .changes/playbooks/fix-pointer-records-without-stamps-tooling-6e092b7a.md create mode 100644 .changes/playwright/fix-pointer-records-without-stamps-tooling-b010511d.md create mode 100644 .changes/powershell-format/fix-pointer-records-without-stamps-tooling-8d3d96d1.md create mode 100644 .changes/rate-limit-guard/fix-pointer-records-without-stamps-tooling-598b9087.md create mode 100644 .changes/repo-hygiene/fix-pointer-records-without-stamps-tooling-231046b1.md create mode 100644 .changes/review/fix-pointer-records-without-stamps-tooling-0f25923f.md create mode 100644 .changes/ruff-format/fix-pointer-records-without-stamps-tooling-34e24f14.md create mode 100644 .changes/session-flow/fix-pointer-records-without-stamps-tooling-d9224283.md create mode 100644 .changes/skill-quality/fix-pointer-records-without-stamps-tooling-090664b4.md create mode 100644 .changes/source-control/fix-pointer-records-without-stamps-tooling-b59c85b8.md create mode 100644 .changes/speech/fix-pointer-records-without-stamps-tooling-619957b2.md create mode 100644 .changes/testing/fix-pointer-records-without-stamps-tooling-6408f323.md create mode 100644 .changes/toolchain/fix-pointer-records-without-stamps-tooling-0306194e.md create mode 100644 .changes/typos-format/fix-pointer-records-without-stamps-tooling-2f098196.md create mode 100644 .changes/user-interface/fix-pointer-records-without-stamps-tooling-62d50d46.md create mode 100644 .changes/verification/fix-pointer-records-without-stamps-tooling-f579a056.md create mode 100644 .changes/visualization/fix-pointer-records-without-stamps-tooling-a08b1002.md create mode 100644 .changes/work-items/fix-pointer-records-without-stamps-tooling-515a3777.md diff --git a/.changes/actionlint/fix-pointer-records-without-stamps-tooling-c9d53472.md b/.changes/actionlint/fix-pointer-records-without-stamps-tooling-c9d53472.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/actionlint/fix-pointer-records-without-stamps-tooling-c9d53472.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/adhd/fix-pointer-records-without-stamps-tooling-2d9d89d3.md b/.changes/adhd/fix-pointer-records-without-stamps-tooling-2d9d89d3.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/adhd/fix-pointer-records-without-stamps-tooling-2d9d89d3.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/ai-briefing/fix-pointer-records-without-stamps-tooling-88b9454f.md b/.changes/ai-briefing/fix-pointer-records-without-stamps-tooling-88b9454f.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/ai-briefing/fix-pointer-records-without-stamps-tooling-88b9454f.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/animation/fix-pointer-records-without-stamps-tooling-f131f5a7.md b/.changes/animation/fix-pointer-records-without-stamps-tooling-f131f5a7.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/animation/fix-pointer-records-without-stamps-tooling-f131f5a7.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/architecture/fix-pointer-records-without-stamps-tooling-779810f0.md b/.changes/architecture/fix-pointer-records-without-stamps-tooling-779810f0.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/architecture/fix-pointer-records-without-stamps-tooling-779810f0.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md b/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md new file mode 100644 index 00000000000..47a5f9d6ba3 --- /dev/null +++ b/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md @@ -0,0 +1,7 @@ +--- +bump: minor +--- + +### Changed + +- `/attribution:audit` asks for an as-of date and recheck trigger only on a record that stores an upstream value; a condensed record whose decision holds no upstream value is a pointer record (decision and pointer), and a missing stamp on one is not a finding. Expiry and trigger-less stamp checks are unchanged. diff --git a/.changes/autonomy/fix-pointer-records-without-stamps-tooling-0a59411b.md b/.changes/autonomy/fix-pointer-records-without-stamps-tooling-0a59411b.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/autonomy/fix-pointer-records-without-stamps-tooling-0a59411b.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/bash-format/fix-pointer-records-without-stamps-tooling-8a65769b.md b/.changes/bash-format/fix-pointer-records-without-stamps-tooling-8a65769b.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/bash-format/fix-pointer-records-without-stamps-tooling-8a65769b.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/biome-format/fix-pointer-records-without-stamps-tooling-2181447b.md b/.changes/biome-format/fix-pointer-records-without-stamps-tooling-2181447b.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/biome-format/fix-pointer-records-without-stamps-tooling-2181447b.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/bugs/fix-pointer-records-without-stamps-tooling-0a48c863.md b/.changes/bugs/fix-pointer-records-without-stamps-tooling-0a48c863.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/bugs/fix-pointer-records-without-stamps-tooling-0a48c863.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/code-tidying/fix-pointer-records-without-stamps-tooling-12c20731.md b/.changes/code-tidying/fix-pointer-records-without-stamps-tooling-12c20731.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/code-tidying/fix-pointer-records-without-stamps-tooling-12c20731.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/codebase-health/fix-pointer-records-without-stamps-tooling-a910a962.md b/.changes/codebase-health/fix-pointer-records-without-stamps-tooling-a910a962.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/codebase-health/fix-pointer-records-without-stamps-tooling-a910a962.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/context-budget/fix-pointer-records-without-stamps-tooling-95f70a9f.md b/.changes/context-budget/fix-pointer-records-without-stamps-tooling-95f70a9f.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/context-budget/fix-pointer-records-without-stamps-tooling-95f70a9f.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/context-guard/fix-pointer-records-without-stamps-tooling-c24f8051.md b/.changes/context-guard/fix-pointer-records-without-stamps-tooling-c24f8051.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/context-guard/fix-pointer-records-without-stamps-tooling-c24f8051.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/corrections/fix-pointer-records-without-stamps-tooling-834d5587.md b/.changes/corrections/fix-pointer-records-without-stamps-tooling-834d5587.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/corrections/fix-pointer-records-without-stamps-tooling-834d5587.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/debugging/fix-pointer-records-without-stamps-tooling-0f63d284.md b/.changes/debugging/fix-pointer-records-without-stamps-tooling-0f63d284.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/debugging/fix-pointer-records-without-stamps-tooling-0f63d284.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/desktop-notification/fix-pointer-records-without-stamps-tooling-f7e3d2b1.md b/.changes/desktop-notification/fix-pointer-records-without-stamps-tooling-f7e3d2b1.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/desktop-notification/fix-pointer-records-without-stamps-tooling-f7e3d2b1.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/discipline/fix-pointer-records-without-stamps-tooling-267957a2.md b/.changes/discipline/fix-pointer-records-without-stamps-tooling-267957a2.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/discipline/fix-pointer-records-without-stamps-tooling-267957a2.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/discovery/fix-pointer-records-without-stamps-tooling-1c6b54e6.md b/.changes/discovery/fix-pointer-records-without-stamps-tooling-1c6b54e6.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/discovery/fix-pointer-records-without-stamps-tooling-1c6b54e6.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/disk-hygiene/fix-pointer-records-without-stamps-tooling-0a71978c.md b/.changes/disk-hygiene/fix-pointer-records-without-stamps-tooling-0a71978c.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/disk-hygiene/fix-pointer-records-without-stamps-tooling-0a71978c.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/display-redaction/fix-pointer-records-without-stamps-tooling-c7c334e2.md b/.changes/display-redaction/fix-pointer-records-without-stamps-tooling-c7c334e2.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/display-redaction/fix-pointer-records-without-stamps-tooling-c7c334e2.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/docs-hygiene/fix-pointer-records-without-stamps-tooling-62a42007.md b/.changes/docs-hygiene/fix-pointer-records-without-stamps-tooling-62a42007.md new file mode 100644 index 00000000000..cbbdda2d7ab --- /dev/null +++ b/.changes/docs-hygiene/fix-pointer-records-without-stamps-tooling-62a42007.md @@ -0,0 +1,8 @@ +--- +bump: patch +--- + +### Changed + +- `/docs-hygiene:audit-derivability` treats a pointer as its own drift control and never asks for an as-of date or recheck trigger on one, a `convert-to-pointer` result included; a recorded recheck trigger stays drift control for a cache. +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/domain-driven-design/fix-pointer-records-without-stamps-tooling-6759e80c.md b/.changes/domain-driven-design/fix-pointer-records-without-stamps-tooling-6759e80c.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/domain-driven-design/fix-pointer-records-without-stamps-tooling-6759e80c.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/education/fix-pointer-records-without-stamps-tooling-21b05b90.md b/.changes/education/fix-pointer-records-without-stamps-tooling-21b05b90.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/education/fix-pointer-records-without-stamps-tooling-21b05b90.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/eol-normalizer/fix-pointer-records-without-stamps-tooling-406f8f30.md b/.changes/eol-normalizer/fix-pointer-records-without-stamps-tooling-406f8f30.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/eol-normalizer/fix-pointer-records-without-stamps-tooling-406f8f30.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/evals/fix-pointer-records-without-stamps-tooling-550c66d1.md b/.changes/evals/fix-pointer-records-without-stamps-tooling-550c66d1.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/evals/fix-pointer-records-without-stamps-tooling-550c66d1.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/gaming/fix-pointer-records-without-stamps-tooling-5d88d801.md b/.changes/gaming/fix-pointer-records-without-stamps-tooling-5d88d801.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/gaming/fix-pointer-records-without-stamps-tooling-5d88d801.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/github/fix-pointer-records-without-stamps-tooling-0e91c91b.md b/.changes/github/fix-pointer-records-without-stamps-tooling-0e91c91b.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/github/fix-pointer-records-without-stamps-tooling-0e91c91b.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/go-format/fix-pointer-records-without-stamps-tooling-6f288687.md b/.changes/go-format/fix-pointer-records-without-stamps-tooling-6f288687.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/go-format/fix-pointer-records-without-stamps-tooling-6f288687.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/guardrails/fix-pointer-records-without-stamps-tooling-36f2b868.md b/.changes/guardrails/fix-pointer-records-without-stamps-tooling-36f2b868.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/guardrails/fix-pointer-records-without-stamps-tooling-36f2b868.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/harness-config/fix-pointer-records-without-stamps-tooling-d56b7d3e.md b/.changes/harness-config/fix-pointer-records-without-stamps-tooling-d56b7d3e.md new file mode 100644 index 00000000000..bd72c191a1c --- /dev/null +++ b/.changes/harness-config/fix-pointer-records-without-stamps-tooling-d56b7d3e.md @@ -0,0 +1,11 @@ +--- +bump: patch +--- + +### Fixed + +- `/harness-config:audit-instructions` I40 no longer marks a bare `#N` in an agent definition whose block also cites N upstream (as `owner/repo#N` or an `/issues/N` or `/pull/N` URL), so a pointer record without an as-of date or recheck trigger can name its upstream bug by number. A block with an as-of date and recheck trigger stays exempt. + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/harness-ops/fix-pointer-records-without-stamps-tooling-f23a1a9a.md b/.changes/harness-ops/fix-pointer-records-without-stamps-tooling-f23a1a9a.md new file mode 100644 index 00000000000..ce842e78d55 --- /dev/null +++ b/.changes/harness-ops/fix-pointer-records-without-stamps-tooling-f23a1a9a.md @@ -0,0 +1,8 @@ +--- +bump: patch +--- + +### Changed + +- `/harness-ops:changelog` reads a fired recheck trigger as a `correct` signal only for a stored value (a recorded default, limit, version gate or measured observation); for a pointer, which carries no trigger, the feature grep is the signal. +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/implementation/fix-pointer-records-without-stamps-tooling-89e23491.md b/.changes/implementation/fix-pointer-records-without-stamps-tooling-89e23491.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/implementation/fix-pointer-records-without-stamps-tooling-89e23491.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/instruction-placement/fix-pointer-records-without-stamps-tooling-811656a8.md b/.changes/instruction-placement/fix-pointer-records-without-stamps-tooling-811656a8.md new file mode 100644 index 00000000000..acb44273277 --- /dev/null +++ b/.changes/instruction-placement/fix-pointer-records-without-stamps-tooling-811656a8.md @@ -0,0 +1,11 @@ +--- +bump: patch +--- + +### Fixed + +- `/instruction-placement:migrate` `remove-shims` ends the printed price where the record's pointer bullet ends, instead of at an As of line, so a pointer record without an as-of date no longer runs the price into the rest of the section. + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/knowledge/fix-pointer-records-without-stamps-tooling-22b763a6.md b/.changes/knowledge/fix-pointer-records-without-stamps-tooling-22b763a6.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/knowledge/fix-pointer-records-without-stamps-tooling-22b763a6.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/machine-health/fix-pointer-records-without-stamps-tooling-09d7a882.md b/.changes/machine-health/fix-pointer-records-without-stamps-tooling-09d7a882.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/machine-health/fix-pointer-records-without-stamps-tooling-09d7a882.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/markdown-format/fix-pointer-records-without-stamps-tooling-f9c31b1c.md b/.changes/markdown-format/fix-pointer-records-without-stamps-tooling-f9c31b1c.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/markdown-format/fix-pointer-records-without-stamps-tooling-f9c31b1c.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/miro/fix-pointer-records-without-stamps-tooling-d4683e03.md b/.changes/miro/fix-pointer-records-without-stamps-tooling-d4683e03.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/miro/fix-pointer-records-without-stamps-tooling-d4683e03.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/multi-agent/fix-pointer-records-without-stamps-tooling-1e445c2e.md b/.changes/multi-agent/fix-pointer-records-without-stamps-tooling-1e445c2e.md new file mode 100644 index 00000000000..353d31dc617 --- /dev/null +++ b/.changes/multi-agent/fix-pointer-records-without-stamps-tooling-1e445c2e.md @@ -0,0 +1,7 @@ +--- +bump: minor +--- + +### Changed + +- `/multi-agent:audit-defaults repo` takes a pointer to the live source as conforming without an as-of date or recheck trigger; `copied-current` now means a restated upstream fact with no pointer, or a stored value (a recorded default, limit, version gate or price) with no as-of date and recheck trigger. diff --git a/.changes/mutation-testing/fix-pointer-records-without-stamps-tooling-4b26d986.md b/.changes/mutation-testing/fix-pointer-records-without-stamps-tooling-4b26d986.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/mutation-testing/fix-pointer-records-without-stamps-tooling-4b26d986.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/pixel-art/fix-pointer-records-without-stamps-tooling-152a381f.md b/.changes/pixel-art/fix-pointer-records-without-stamps-tooling-152a381f.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/pixel-art/fix-pointer-records-without-stamps-tooling-152a381f.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/planning/fix-pointer-records-without-stamps-tooling-d6056761.md b/.changes/planning/fix-pointer-records-without-stamps-tooling-d6056761.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/planning/fix-pointer-records-without-stamps-tooling-d6056761.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/playbooks/fix-pointer-records-without-stamps-tooling-6e092b7a.md b/.changes/playbooks/fix-pointer-records-without-stamps-tooling-6e092b7a.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/playbooks/fix-pointer-records-without-stamps-tooling-6e092b7a.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/playwright/fix-pointer-records-without-stamps-tooling-b010511d.md b/.changes/playwright/fix-pointer-records-without-stamps-tooling-b010511d.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/playwright/fix-pointer-records-without-stamps-tooling-b010511d.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/powershell-format/fix-pointer-records-without-stamps-tooling-8d3d96d1.md b/.changes/powershell-format/fix-pointer-records-without-stamps-tooling-8d3d96d1.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/powershell-format/fix-pointer-records-without-stamps-tooling-8d3d96d1.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/rate-limit-guard/fix-pointer-records-without-stamps-tooling-598b9087.md b/.changes/rate-limit-guard/fix-pointer-records-without-stamps-tooling-598b9087.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/rate-limit-guard/fix-pointer-records-without-stamps-tooling-598b9087.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/repo-hygiene/fix-pointer-records-without-stamps-tooling-231046b1.md b/.changes/repo-hygiene/fix-pointer-records-without-stamps-tooling-231046b1.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/repo-hygiene/fix-pointer-records-without-stamps-tooling-231046b1.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/review/fix-pointer-records-without-stamps-tooling-0f25923f.md b/.changes/review/fix-pointer-records-without-stamps-tooling-0f25923f.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/review/fix-pointer-records-without-stamps-tooling-0f25923f.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/ruff-format/fix-pointer-records-without-stamps-tooling-34e24f14.md b/.changes/ruff-format/fix-pointer-records-without-stamps-tooling-34e24f14.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/ruff-format/fix-pointer-records-without-stamps-tooling-34e24f14.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/session-flow/fix-pointer-records-without-stamps-tooling-d9224283.md b/.changes/session-flow/fix-pointer-records-without-stamps-tooling-d9224283.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/session-flow/fix-pointer-records-without-stamps-tooling-d9224283.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/skill-quality/fix-pointer-records-without-stamps-tooling-090664b4.md b/.changes/skill-quality/fix-pointer-records-without-stamps-tooling-090664b4.md new file mode 100644 index 00000000000..e62a10650b4 --- /dev/null +++ b/.changes/skill-quality/fix-pointer-records-without-stamps-tooling-090664b4.md @@ -0,0 +1,11 @@ +--- +bump: patch +--- + +### Fixed + +- Check 29 no longer warns on a bare `#N` whose block also cites N upstream (as `owner/repo#N` or an `/issues/N` or `/pull/N` URL), so a pointer record without an as-of date or recheck trigger can name its upstream bug by number. A block with an as-of date and recheck trigger stays exempt. + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/source-control/fix-pointer-records-without-stamps-tooling-b59c85b8.md b/.changes/source-control/fix-pointer-records-without-stamps-tooling-b59c85b8.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/source-control/fix-pointer-records-without-stamps-tooling-b59c85b8.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/speech/fix-pointer-records-without-stamps-tooling-619957b2.md b/.changes/speech/fix-pointer-records-without-stamps-tooling-619957b2.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/speech/fix-pointer-records-without-stamps-tooling-619957b2.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/testing/fix-pointer-records-without-stamps-tooling-6408f323.md b/.changes/testing/fix-pointer-records-without-stamps-tooling-6408f323.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/testing/fix-pointer-records-without-stamps-tooling-6408f323.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/toolchain/fix-pointer-records-without-stamps-tooling-0306194e.md b/.changes/toolchain/fix-pointer-records-without-stamps-tooling-0306194e.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/toolchain/fix-pointer-records-without-stamps-tooling-0306194e.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/typos-format/fix-pointer-records-without-stamps-tooling-2f098196.md b/.changes/typos-format/fix-pointer-records-without-stamps-tooling-2f098196.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/typos-format/fix-pointer-records-without-stamps-tooling-2f098196.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/user-interface/fix-pointer-records-without-stamps-tooling-62d50d46.md b/.changes/user-interface/fix-pointer-records-without-stamps-tooling-62d50d46.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/user-interface/fix-pointer-records-without-stamps-tooling-62d50d46.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/verification/fix-pointer-records-without-stamps-tooling-f579a056.md b/.changes/verification/fix-pointer-records-without-stamps-tooling-f579a056.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/verification/fix-pointer-records-without-stamps-tooling-f579a056.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/visualization/fix-pointer-records-without-stamps-tooling-a08b1002.md b/.changes/visualization/fix-pointer-records-without-stamps-tooling-a08b1002.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/visualization/fix-pointer-records-without-stamps-tooling-a08b1002.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/.changes/work-items/fix-pointer-records-without-stamps-tooling-515a3777.md b/.changes/work-items/fix-pointer-records-without-stamps-tooling-515a3777.md new file mode 100644 index 00000000000..27c2eeec26c --- /dev/null +++ b/.changes/work-items/fix-pointer-records-without-stamps-tooling-515a3777.md @@ -0,0 +1,7 @@ +--- +bump: patch +--- + +### Changed + +- The README options reference lists its upstream documentation as pointers only, with no as-of date or recheck trigger. diff --git a/plugins/actionlint/README.md b/plugins/actionlint/README.md index a0fd1c115e7..d38e8692a48 100644 --- a/plugins/actionlint/README.md +++ b/plugins/actionlint/README.md @@ -142,9 +142,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/adhd/README.md b/plugins/adhd/README.md index a234572d059..70be3cafcb9 100644 --- a/plugins/adhd/README.md +++ b/plugins/adhd/README.md @@ -176,9 +176,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Attribution diff --git a/plugins/ai-briefing/README.md b/plugins/ai-briefing/README.md index 51502d76edc..e927087ae65 100644 --- a/plugins/ai-briefing/README.md +++ b/plugins/ai-briefing/README.md @@ -122,7 +122,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/animation/README.md b/plugins/animation/README.md index 0f4d0eb0c5a..86bb998f4c3 100644 --- a/plugins/animation/README.md +++ b/plugins/animation/README.md @@ -108,7 +108,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/architecture/README.md b/plugins/architecture/README.md index 4da0639545a..8590247cabb 100644 --- a/plugins/architecture/README.md +++ b/plugins/architecture/README.md @@ -285,9 +285,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/attribution/skills/audit/reference/dispositions.md b/plugins/attribution/skills/audit/reference/dispositions.md index 936eb151580..fcef26adf7b 100644 --- a/plugins/attribution/skills/audit/reference/dispositions.md +++ b/plugins/attribution/skills/audit/reference/dispositions.md @@ -31,7 +31,7 @@ Three edit. Two do not. |---|---|---| | `convert-to-pointer` | Replaces the restatement with a link to the source | The reader can follow the link at the moment they need the fact | | `trim-to-citation` | Keeps a short quoted excerpt, attributed, and drops the rest | A specific span is worth quoting verbatim and the surrounding restatement is not | -| `condense-to-stamped-record` | Condenses to a stamped record: the surface's own decision in its own words, a pointer, an as-of date, a recheck trigger | The surface must act on the fact even when the source is unreachable | +| `condense-to-stamped-record` | Condenses to a record: the surface's own decision in its own words and a pointer, plus an as-of date and a recheck trigger when the decision stores an upstream value | The surface must act on the fact even when the source is unreachable | | `leave-with-reason` | Records why the passage stays | A carve-out applies, or a review veto fired, or the human decided | | `neutral-not-found` | Records that no source was identified | Budgets were exhausted; every searched surface is named | @@ -61,8 +61,8 @@ read often" does not make a copy acceptable, it makes a stamped record the right ## The stamped record, when condensing -A stamped record stores no source text, quoted or paraphrased. It carries all of these parts or -it is not one: +A condensed record stores no source text, quoted or paraphrased. It carries these parts or it is +not one: 1. **The decision**: what the surface does, in its own words, narrow enough to check. Where the surface must act on a value offline, the value appears as the surface's own setting or firing @@ -72,6 +72,12 @@ it is not one: 3. **The as-of date**: when the decision was last derived from the source. 4. **The recheck trigger**: the observable event that obliges re-deriving it. +Parts 3 and 4 belong to a stored value: a decision that holds an upstream default, limit, version +gate, price, error string or measured observation, which is what an offline surface acting on the +fact usually holds. A condensed record whose decision holds no upstream value is a pointer record: +the decision and the pointer alone, with no as-of date or trigger, since a link check catches a +dead pointer and whoever fetches it sees what changed. + The labels the marketplace's upstream-drift convention uses are `**Pointer**`, `**As of**` and `**Recheck trigger**`, each on its own bullet under the decision. @@ -98,10 +104,10 @@ The dispositions below are what the report recommends, not what a run performs. | `condense-to-stamped-record` | The surface must act on the fact without the source. The offline-load-bearing rule above still applies: it selects the stamped record over a bare pointer whatever the finding's tier. | | `leave-with-reason` | A carve-out applies (a conforming pointer or record, owned content, a distilling-file surface whose own attribution enumerates the fact, quoted and cited text), or the human decided. | -A recommended stamped record carries the parts above: the surface's decision in its own words, the -pointer, an ISO 8601 as-of date `check-stamps.sh` can parse, and a trigger naming an event someone -could notice. When -no such trigger exists, recommend `convert-to-pointer`. +A recommended record carries the parts above: the surface's decision in its own words and the +pointer, and, for a stored value, an ISO 8601 as-of date `check-stamps.sh` can parse and a trigger +naming an event someone could notice. When a stored value has no such trigger, recommend +`convert-to-pointer`. ## Guards, all of which must pass before an edit is kept diff --git a/plugins/attribution/skills/audit/reference/rubric.md b/plugins/attribution/skills/audit/reference/rubric.md index 370f265233e..287b7236c53 100644 --- a/plugins/attribution/skills/audit/reference/rubric.md +++ b/plugins/attribution/skills/audit/reference/rubric.md @@ -61,8 +61,10 @@ drift is handled by its sync path, not by this audit. A passage carrying a whole stamped record, a pointer to the source, an as-of date, and a recheck trigger beside the decision it records, is already the sanctioned end state a copy is converted -into. It is not a copy to be found. Text inside the record that matches the source is still judged -like any other passage. +into when it stores an upstream value (a default, limit, version gate, price, error string or +measured observation). It is not a copy to be found. Text inside the record that matches the source +is still judged like any other passage. A pointer record, the decision and a pointer with no +upstream value, needs no as-of date or trigger: its missing stamp is not a finding. **Conforming is the whole test.** A dated sentence with no trigger is not carved out; it is a `rule-trigger-less-stamp` candidate where the repository has enabled that check, and a plain @@ -400,10 +402,11 @@ content to carry a recheck trigger. *Pointer:* `melodic-software/standards`, 2026-10-01. *Recheck trigger:* any revision of that org standard, or of the upstream-drift convention's Boundary section that cites it. -**A conforming record's parts.** This rubric treats a record as conforming when it carries a -pointer to the source (a specific URL or probe), an as-of date, and a recheck trigger, the -observable event that obliges re-derivation, beside the decision it records. A date alone does not -qualify as a trigger. *Pointer:* `docs/contracts/upstream-drift/README.md` "Required parts" and +**A conforming record's parts.** This rubric treats a record that stores an upstream value as +conforming when it carries a pointer to the source (a specific URL or probe), an as-of date, and a +recheck trigger, the observable event that obliges re-derivation, beside the decision it records. +A date alone does not qualify as a trigger. A pointer that stores no value conforms with the +pointer alone. *Pointer:* `docs/contracts/upstream-drift/README.md` "Required parts" and "The observability bar" in the marketplace repository. *As of:* 2026-10-01. *Recheck trigger:* any change to that convention's required parts, or the org standard broadening the accepted trigger forms in a way this repository adopts. diff --git a/plugins/autonomy/README.md b/plugins/autonomy/README.md index 734333ab44f..26238ed5934 100644 --- a/plugins/autonomy/README.md +++ b/plugins/autonomy/README.md @@ -331,7 +331,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/bash-format/README.md b/plugins/bash-format/README.md index 847931abf95..d38391adb83 100644 --- a/plugins/bash-format/README.md +++ b/plugins/bash-format/README.md @@ -208,9 +208,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/biome-format/README.md b/plugins/biome-format/README.md index 8e13e5e3f47..00fbfa5b7a7 100644 --- a/plugins/biome-format/README.md +++ b/plugins/biome-format/README.md @@ -179,9 +179,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/bugs/README.md b/plugins/bugs/README.md index 7fdd3753209..f1264b7a3e7 100644 --- a/plugins/bugs/README.md +++ b/plugins/bugs/README.md @@ -171,9 +171,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Filing a report diff --git a/plugins/code-tidying/README.md b/plugins/code-tidying/README.md index 8ca82a25031..aaa5596083d 100644 --- a/plugins/code-tidying/README.md +++ b/plugins/code-tidying/README.md @@ -235,9 +235,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/codebase-health/README.md b/plugins/codebase-health/README.md index 637e73bbe1d..381d45ea319 100644 --- a/plugins/codebase-health/README.md +++ b/plugins/codebase-health/README.md @@ -145,9 +145,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/context-budget/README.md b/plugins/context-budget/README.md index 9dd04a09748..4be218720d1 100644 --- a/plugins/context-budget/README.md +++ b/plugins/context-budget/README.md @@ -282,7 +282,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/context-guard/README.md b/plugins/context-guard/README.md index 80ee5c1fa67..4795f36b5f9 100644 --- a/plugins/context-guard/README.md +++ b/plugins/context-guard/README.md @@ -496,9 +496,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Consumers diff --git a/plugins/corrections/README.md b/plugins/corrections/README.md index 7838f414c75..217d3550f1e 100644 --- a/plugins/corrections/README.md +++ b/plugins/corrections/README.md @@ -113,7 +113,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/debugging/README.md b/plugins/debugging/README.md index cfcf50c0d50..2624bc9a7f1 100644 --- a/plugins/debugging/README.md +++ b/plugins/debugging/README.md @@ -105,9 +105,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/desktop-notification/README.md b/plugins/desktop-notification/README.md index 68b27c20012..df0b6b5bbf8 100644 --- a/plugins/desktop-notification/README.md +++ b/plugins/desktop-notification/README.md @@ -174,9 +174,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Telemetry (opt-in) diff --git a/plugins/discipline/README.md b/plugins/discipline/README.md index c40780b925d..0ebb557bc05 100644 --- a/plugins/discipline/README.md +++ b/plugins/discipline/README.md @@ -524,7 +524,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/discovery/README.md b/plugins/discovery/README.md index 8a7b77f5671..b62e0aca8b1 100644 --- a/plugins/discovery/README.md +++ b/plugins/discovery/README.md @@ -191,9 +191,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/disk-hygiene/README.md b/plugins/disk-hygiene/README.md index 0720fff7fad..0e11dc79a7a 100644 --- a/plugins/disk-hygiene/README.md +++ b/plugins/disk-hygiene/README.md @@ -710,9 +710,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/display-redaction/README.md b/plugins/display-redaction/README.md index 8ee84d572e5..bf8605c82d6 100644 --- a/plugins/display-redaction/README.md +++ b/plugins/display-redaction/README.md @@ -152,7 +152,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/docs-hygiene/README.md b/plugins/docs-hygiene/README.md index b70efcbcc54..3d5f44bdd7d 100644 --- a/plugins/docs-hygiene/README.md +++ b/plugins/docs-hygiene/README.md @@ -108,9 +108,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/docs-hygiene/skills/audit-derivability/SKILL.md b/plugins/docs-hygiene/skills/audit-derivability/SKILL.md index 4623eae267e..57f1a5d5503 100644 --- a/plugins/docs-hygiene/skills/audit-derivability/SKILL.md +++ b/plugins/docs-hygiene/skills/audit-derivability/SKILL.md @@ -148,7 +148,7 @@ After the ledger, OFFER to route actionable verdicts (delete / convert-to-pointe - **Read-only with respect to the repository.** No `Edit` or `Write` inside the repo, no `Bash` that mutates it; session-scratchpad ledgers and artifacts are the one sanctioned write surface. The author applies every deletion and rewrite. Deletion is the highest-stakes doc edit; the classifier only recommends. - **Never derivability alone.** A `delete` verdict requires all of: derivable, low re-derivation cost, no owned facts. Any owned non-derivable fact forces `keep-owns-facts`. -- **Cache verdicts carry a drift-control condition or they demote.** No regeneration path and no recheck trigger → not a cache, demote to pointer/delete. +- **Cache verdicts carry a drift-control condition or they demote.** No regeneration path and no recheck trigger → not a cache, demote to pointer/delete. A pointer is its own drift control and needs no as-of date or recheck trigger (`context/rubric.md`, Factor 3). - **Load-bearing or contested deletions are spot-tested by a fresh, non-fork subagent**, never confirmed from this (contaminated) context, never by the Agent tool's `fork` subagent type, which inherits the parent conversation. A launch-loaded audited file is spot-tested only by `Explore` or `Plan` (this skill's choice; see Sources for which agents load those files). A verdict whose spot-test is deferred (e.g. past a sweep's cap) or skipped by a `light` or `off` verification level stays provisional and is never routed as actionable. - **Audience named in every verdict.** Agent-facing and human-facing docs clear different deletion bars. - **The empty-target escalation is offer-only.** A repo-wide sweep from the no-op path runs only after explicit user confirmation; decline or silence ends as the no-op. diff --git a/plugins/docs-hygiene/skills/audit-derivability/context/rubric.md b/plugins/docs-hygiene/skills/audit-derivability/context/rubric.md index 62a1904cb92..7b4b092ca73 100644 --- a/plugins/docs-hygiene/skills/audit-derivability/context/rubric.md +++ b/plugins/docs-hygiene/skills/audit-derivability/context/rubric.md @@ -98,6 +98,12 @@ is legitimate only when the cache cannot silently rot, i.e. there is: With neither, the "cache" is an unmaintained copy waiting to drift. **Demote it** to `convert-to-pointer` (point at the live source) or `delete`. +A pointer is its own drift control: it holds no copy, a link check catches a +dead one, and whoever fetches it sees what changed. Never require an as-of date +or a recheck trigger on a pointer, a `convert-to-pointer` result included; the +recorded recheck trigger above is drift control for a cache, which stores what +its source says. + ## Factor 4: Fact ownership (the trump card) Some content is not derivable at any cost because the repository does not diff --git a/plugins/domain-driven-design/README.md b/plugins/domain-driven-design/README.md index 0b6afc45c9a..97ccc7b5b2e 100644 --- a/plugins/domain-driven-design/README.md +++ b/plugins/domain-driven-design/README.md @@ -74,9 +74,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/education/README.md b/plugins/education/README.md index f5cbceef047..96870a8b33d 100644 --- a/plugins/education/README.md +++ b/plugins/education/README.md @@ -171,9 +171,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/eol-normalizer/README.md b/plugins/eol-normalizer/README.md index 31afe27ab28..92d27f5615f 100644 --- a/plugins/eol-normalizer/README.md +++ b/plugins/eol-normalizer/README.md @@ -155,9 +155,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/evals/README.md b/plugins/evals/README.md index e1a791510c6..23871326e94 100644 --- a/plugins/evals/README.md +++ b/plugins/evals/README.md @@ -180,7 +180,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/gaming/README.md b/plugins/gaming/README.md index fb8843d145c..4a000790b99 100644 --- a/plugins/gaming/README.md +++ b/plugins/gaming/README.md @@ -138,9 +138,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/github/README.md b/plugins/github/README.md index b482a5029e9..c419dce44f9 100644 --- a/plugins/github/README.md +++ b/plugins/github/README.md @@ -108,7 +108,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/go-format/README.md b/plugins/go-format/README.md index 0c95f61b85f..e2e34164ddc 100644 --- a/plugins/go-format/README.md +++ b/plugins/go-format/README.md @@ -168,9 +168,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/guardrails/README.md b/plugins/guardrails/README.md index b322fc875b8..97b4637b43d 100644 --- a/plugins/guardrails/README.md +++ b/plugins/guardrails/README.md @@ -1792,9 +1792,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ### Unwatched sessions diff --git a/plugins/harness-config/README.md b/plugins/harness-config/README.md index a8ffa03c12e..f53279769cc 100644 --- a/plugins/harness-config/README.md +++ b/plugins/harness-config/README.md @@ -312,9 +312,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/harness-config/skills/audit-instructions/reference/criteria.md b/plugins/harness-config/skills/audit-instructions/reference/criteria.md index f218558f718..a17337ab098 100644 --- a/plugins/harness-config/skills/audit-instructions/reference/criteria.md +++ b/plugins/harness-config/skills/audit-instructions/reference/criteria.md @@ -2691,10 +2691,12 @@ is `/skill-quality:check`'s; this row covers the agents it does not read. "added in #N", "fixed by PR 1234", or an incident narrative ("after the lane stalled in September") that explains why a line exists instead of stating the rule. - **Must NOT flag:** a code span; a cross-repository `owner/repo#N`, which names an upstream - record; a `TODO(#N)` marker; fenced or indented code; any line inside a pointer-record block, - meaning a paragraph or bullet run that carries an as-of date and a recheck trigger anywhere in - it. These are the exemptions `/skill-quality:check` applies to skills, so one line gets one verdict on - either surface. + record; a `TODO(#N)` marker; fenced or indented code; a bare `#N` whose paragraph or bullet run + also cites N upstream, as `owner/repo#N` or an `/issues/N` or `/pull/N` URL (a pointer record + naming its upstream bug); any line inside a stored-value record block, meaning a paragraph or + bullet run that carries an as-of date and a recheck trigger anywhere in it. These are the + exemptions `/skill-quality:check` applies to skills, so one line gets one verdict on either + surface. - **Pre-scan:** `instruction-scan.sh` seeds the number forms as `I40` rows on `agents/*.md` paths only, with the exemptions above; incident narratives are lane-only. - **Remediate:** state the rule in the present tense and move the history to the CHANGELOG, an ADR, diff --git a/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.sh b/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.sh index 0b2bb075c59..3a227149ba5 100755 --- a/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.sh +++ b/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.sh @@ -69,8 +69,8 @@ # I40 own-repository history reference (a bare hash-number, alone or after a # pull-request word) on agents/*.md paths only. Code spans, owner/repo # references, a tracked-work marker's issue link, fenced and indented code, -# and every line of a block carrying an as-of date and a recheck trigger -# are exempt. +# a reference whose block cites the same number upstream, and every line +# of a block carrying an as-of date and a recheck trigger are exempt. # # Advisory: prints candidate rows, ALWAYS exits 0 (candidates never fail a run). # Requires grep, tr, and awk; exits 2 when one is absent. @@ -247,9 +247,11 @@ I25_ERE="${WB_L}temperature${WB_R}|${WB_L}top_p${WB_R}|${WB_L}top_k${WB_R}" # the lowercased line after code spans and tracked-work marker links are removed, outside fenced # and indented code blocks. The ERE itself rejects owner/repo#N: # a `#` after a word character, `&`, `/`, `.`, `#`, or `-` is an anchor, an -# entity, or a path, not a reference. A block (a run of non-blank lines) that -# carries both an as-of date and a recheck trigger is a pointer record and -# never emits. +# entity, or a path, not a reference. A reference whose block (a run of +# non-blank lines) also cites its number upstream, as owner/repo#N or an +# /issues/N or /pull/N URL, belongs to a pointer record and never emits; nor +# does any line of a stored-value block, one carrying both an as-of date and a +# recheck trigger. I40_REF_ERE="(^|[^[:alnum:]_&/.#-])#[0-9]+([^[:alnum:]_]|\$)|${WB_L}(pr|pull request)s? #?[0-9]+${WB_R}" I40_ASOF_ERE="as[- ]of[^0-9]{0,24}[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" I40_RECHECK_ERE="${WB_L}re-?check" @@ -408,9 +410,23 @@ run_i40() { [[ ${#agents[@]} -gt 0 ]] || continue LC_ALL=C awk -v ref="$I40_REF_ERE" -v asof="$I40_ASOF_ERE" \ -v recheck="$I40_RECHECK_ERE" ' + function cited(n) { + return blk ~ ("[a-z0-9_.-]+/[a-z0-9_.-]+#" n "([^0-9]|$)") || + blk ~ ("/(issues|pull)/" n "([^0-9]|$)") + } + # 1 when the line holds a reference the block does not cite upstream. + function own_ref(s, m) { + while (match(s, ref)) { + m = substr(s, RSTART, RLENGTH) + gsub(/[^0-9]/, "", m) + if (!cited(m)) return 1 + s = substr(s, RSTART + RLENGTH) + } + return 0 + } function flush( k) { if (nb > 0 && !(blk ~ asof && blk ~ recheck)) - for (k = 1; k <= nb; k++) printf "%s\003%s:\n", cur, hit[k] + for (k = 1; k <= nb; k++) if (own_ref(hl[k])) printf "%s\003%s:\n", cur, hit[k] nb = 0; blk = "" } # Drop each code span: a backtick run up to the next run of the same @@ -455,7 +471,7 @@ run_i40() { blk = blk " " low low = strip_spans(low) gsub(/todo\(#[0-9]+\)/, "", low) - if (low ~ ref) hit[++nb] = FNR + if (low ~ ref) { hit[++nb] = FNR; hl[nb] = low } } END { flush() } ' "${agents[@]}" 2>/dev/null diff --git a/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.test.sh b/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.test.sh index f8b2724efd4..5113c051f43 100755 --- a/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.test.sh +++ b/plugins/harness-config/skills/audit-instructions/scripts/instruction-scan.test.sh @@ -630,8 +630,9 @@ assert_contains "a spaced file name is scanned" "$OUT" "$SPACED:2:I28-a" # reference/criteria.md: a bare hash-number reference, alone, after a pull-request # word, or after "added in", in an agents/*.md file is a candidate; a code span, a # cross-repository owner/repo reference, a tracked-work marker's issue link, -# fenced code, and any line inside a block carrying both an as-of date and a -# recheck trigger are not. The same text outside agents/ is not this row's. +# fenced code, a reference whose block cites the same number upstream, and any +# line inside a block carrying both an as-of date and a recheck trigger are not. +# The same text outside agents/ is not this row's. mkdir -p "$TEST_TMPDIR/agents" I40F="$TEST_TMPDIR/agents/worker.md" cat >"$I40F" <<'EOF' @@ -659,6 +660,12 @@ Verified against #2468, as of 2026-10-02. ```text fixed in #999 ``` + +- **Pointer**: see anthropics/claude-code#8961; when #8961 closes, drop the flag. + +- **Pointer**: [the report](https://github.com/anthropics/claude-code/issues/8962); when #8962 closes, drop the flag. + +- **Pointer**: see anthropics/claude-code#8961; this step came from #4444. EOF I40S="$TEST_TMPDIR/SKILL.md" cat >"$I40S" <<'EOF' @@ -673,8 +680,11 @@ assert_not_contains "I40: TODO(#N) stays quiet" "$OUT" "$I40F:14:I40" assert_not_contains "I40: a pointer-record block stays quiet" "$OUT" "$I40F:16:I40" assert_contains "I40: an as-of date with no recheck trigger is not a pointer record" "$OUT" "$I40F:20:I40" assert_not_contains "I40: fenced code stays quiet" "$OUT" "$I40F:23:I40" +assert_not_contains "I40: an unstamped pointer's #N cited upstream as owner/repo#N stays quiet" "$OUT" "$I40F:26:I40" +assert_not_contains "I40: an unstamped pointer's #N cited upstream by issue URL stays quiet" "$OUT" "$I40F:28:I40" +assert_contains "I40: a #N its unstamped block does not cite upstream is a candidate" "$OUT" "$I40F:30:I40" assert_not_contains "I40: the same text outside agents/ is not this row's" "$OUT" "$I40S:1:I40" -assert_eq "I40: exactly three agent candidates" "3" "$(printf '%s\n' "$OUT" | grep -c ':I40$')" +assert_eq "I40: exactly four agent candidates" "4" "$(printf '%s\n' "$OUT" | grep -c ':I40$')" OUT=$(bash "$SCRIPT" --body-only "$I40F") assert_contains "I40: --body-only keeps body rows" "$OUT" "$I40F:6:I40" diff --git a/plugins/harness-ops/README.md b/plugins/harness-ops/README.md index a5fa883c24c..b40988c6789 100644 --- a/plugins/harness-ops/README.md +++ b/plugins/harness-ops/README.md @@ -575,9 +575,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/harness-ops/skills/changelog/context/classification-rubric.md b/plugins/harness-ops/skills/changelog/context/classification-rubric.md index 84a40051ec9..7600ac74105 100644 --- a/plugins/harness-ops/skills/changelog/context/classification-rubric.md +++ b/plugins/harness-ops/skills/changelog/context/classification-rubric.md @@ -18,7 +18,7 @@ A skip item leaves no row and no line; only the count in the read summary shows - Grep finds the item's feature, field, event or flag in a component, and the item changes what is true about it - A bug the component documents as a quirk is fixed upstream, or a deprecation or removal hits something the component uses -- A recheck trigger on a component fires +- A recheck trigger on a component's stored value (a recorded default, limit, version gate or measured observation) fires. A pointer carries no trigger; the feature grep above is its signal The row names the claim as the component states it (false) and as the item states it (true). A row without both halves is not a correct row. diff --git a/plugins/implementation/README.md b/plugins/implementation/README.md index 5d9cb36c475..73d2777d72c 100644 --- a/plugins/implementation/README.md +++ b/plugins/implementation/README.md @@ -203,9 +203,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/instruction-placement/README.md b/plugins/instruction-placement/README.md index 8a8abcdfd83..759af18bab0 100644 --- a/plugins/instruction-placement/README.md +++ b/plugins/instruction-placement/README.md @@ -265,7 +265,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/instruction-placement/skills/migrate/reference/sources.md b/plugins/instruction-placement/skills/migrate/reference/sources.md index 63f6d520498..e8e4886a034 100644 --- a/plugins/instruction-placement/skills/migrate/reference/sources.md +++ b/plugins/instruction-placement/skills/migrate/reference/sources.md @@ -279,7 +279,7 @@ pointer, never restated here. and . Both pages fetched by the rung-1 route on 2026-09-29, both slugs present in `llms.txt`. `scripts/remove-shims.sh` - prints the paragraph above this line and this pointer, and stops at the As of line. + prints the paragraph above this line and this pointer, and stops where this bullet ends. - **As of**: 2026-09-29 - **Recheck trigger**: either page changes that table, the hook's firing rule for `AGENTS.md`, or the `/memory` listing. diff --git a/plugins/instruction-placement/skills/migrate/scripts/remove-shims.sh b/plugins/instruction-placement/skills/migrate/scripts/remove-shims.sh index 1bc6bc6606a..893e77c447f 100755 --- a/plugins/instruction-placement/skills/migrate/scripts/remove-shims.sh +++ b/plugins/instruction-placement/skills/migrate/scripts/remove-shims.sh @@ -165,13 +165,14 @@ echo echo "What removing the shims costs (reference/sources.md, 'What shim removal costs'):" if [[ -f "$SOURCES_MD" ]]; then # The record's decision is the paragraph directly above its Pointer line, so - # the price is that paragraph and the pointer, up to the As of line. + # the price is that paragraph and the pointer bullet with its indented + # continuation lines; the next bullet, blank line or heading ends it. tr -d '\r' <"$SOURCES_MD" | awk '/^## What shim removal costs/ { f = 1; next } !f { next } - /^## / || /^- \*\*As of\*\*/ { exit } - /^- \*\*Pointer\*\*/ { for (i = 1; i <= n; i++) print " " para[i]; print ""; p = 1 } - p { print " " $0; next } + /^## / { exit } + p { if (/^[[:space:]]*$/ || /^[^[:space:]]/) exit; print " " $0; next } + /^- \*\*Pointer\*\*/ { for (i = 1; i <= n; i++) print " " para[i]; print ""; p = 1; print " " $0; next } /^[[:space:]]*$/ { gap = 1; next } { if (gap) { n = 0; gap = 0 } para[++n] = $0 }' else diff --git a/plugins/instruction-placement/skills/migrate/scripts/remove-shims.test.sh b/plugins/instruction-placement/skills/migrate/scripts/remove-shims.test.sh index 77d729a6dd7..d61bbe020e5 100755 --- a/plugins/instruction-placement/skills/migrate/scripts/remove-shims.test.sh +++ b/plugins/instruction-placement/skills/migrate/scripts/remove-shims.test.sh @@ -254,7 +254,7 @@ OUT=$(bash "$SCRIPT" --root "$READY" --installed-plugins "$TMP/installed-current assert_eq "no --confirm exits 1" 1 "$rc" assert_contains "and prints what removal costs" "$OUT" "InstructionsLoaded" assert_contains "and prints the record's pointer" "$OUT" " - **Pointer**: " -assert_not_contains "and stops before the as-of date" "$OUT" "**As of**" +assert_not_contains "and stops at the end of the pointer bullet" "$OUT" "**As of**" assert_contains "and says it is not confirmed" "$OUT" "Not confirmed" assert_eq "and the repository is untouched" "" "$(cd "$READY" && git status --porcelain)" @@ -296,6 +296,27 @@ GOT_PRICE="$(printf '%s\n' "$OUT" | awk '/^What removing the shims costs/ { f = 1 } /^ Nested AGENTS.md files/ || /^Not confirmed/ { exit } f')" assert_eq "the price is exactly the decision and its pointer" "$EXPECTED_PRICE" "$GOT_PRICE" +# A pointer record carries no as-of date or trigger: the pointer bullet's own +# end (a blank line here) ends the price, so the paragraph after it is left out. +cat >"$PRICE_STUB/reference/sources.md" <<'EOF' +# Sources + +## What shim removal costs + +The decision, first line, +and its second line. + +- **Pointer**: for the topic, see ; + a continuation line. + +A note after the record the price never reaches. +EOF +OUT=$(bash "$PRICE_STUB/scripts/remove-shims.sh" --root "$READY" --installed-plugins \ + "$TMP/installed-current.json" --claude-bin "$TMP/bin/claude-met") +GOT_PRICE="$(printf '%s\n' "$OUT" | + awk '/^What removing the shims costs/ { f = 1 } /^ Nested AGENTS.md files/ || /^Not confirmed/ { exit } f')" +assert_eq "an unstamped pointer record's price ends at the pointer bullet" "$EXPECTED_PRICE" "$GOT_PRICE" + # A nested AGENTS.md adds the write-trigger loss to the price, before any # confirmation and before the probe that measures it has run. assert_contains "a nested AGENTS.md prices the write-trigger loss" "$OUT" \ diff --git a/plugins/knowledge/README.md b/plugins/knowledge/README.md index da243e0b083..95845e73804 100644 --- a/plugins/knowledge/README.md +++ b/plugins/knowledge/README.md @@ -175,9 +175,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/machine-health/README.md b/plugins/machine-health/README.md index 1e8e2b0972c..36e7d71047e 100644 --- a/plugins/machine-health/README.md +++ b/plugins/machine-health/README.md @@ -131,9 +131,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Tests diff --git a/plugins/markdown-format/README.md b/plugins/markdown-format/README.md index f1fd4cca58b..78fb1385d4d 100644 --- a/plugins/markdown-format/README.md +++ b/plugins/markdown-format/README.md @@ -246,9 +246,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/miro/README.md b/plugins/miro/README.md index b01ef23934c..f1899c6c9a5 100644 --- a/plugins/miro/README.md +++ b/plugins/miro/README.md @@ -232,7 +232,4 @@ Every option here is `sensitive`, so the install fallback for a release without - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/multi-agent/tests/drift-audit.test.mjs b/plugins/multi-agent/tests/drift-audit.test.mjs index 4716a13b624..1a7ffe462d0 100644 --- a/plugins/multi-agent/tests/drift-audit.test.mjs +++ b/plugins/multi-agent/tests/drift-audit.test.mjs @@ -338,6 +338,14 @@ test('skeptics see the reader pointer beside each repo claim', async () => { assert.match(data(by(calls, 'skeptic:')[0].prompt, 'findings')[0].pointer, /as of 2026-10-01/) }) +test('repo finders take a pointer without a stamp as conforming and keep the stamp for stored values', async () => { + const { calls } = await run({ mode: 'repo', targets: [{ area: 'a', files: ['docs/a.md'] }] }) + const prompt = by(calls, 'find:')[0].prompt + assert.match(prompt, /section-anchored link that needs no as-of date or recheck trigger/) + assert.match(prompt, /no pointer to its source, or is a stored value with no as-of date and recheck trigger/) + assert.doesNotMatch(prompt, /records the pointer, an as-of date and a recheck trigger/) +}) + test('sources off the fetch-gate hosts, or with a query string, are dropped before any stage runs', async () => { const { result, logs } = await run({ mode: 'repo', targets: TARGETS, upstream: ['https://example.org/x', 'https://code.claude.com/docs?x=1', 'https://code.claude.com/docs/en/hooks'] }) assert.deepEqual(result.sources, ['https://code.claude.com/docs/en/hooks']) diff --git a/plugins/multi-agent/workflows/drift-audit.js b/plugins/multi-agent/workflows/drift-audit.js index a6a6acfbd93..4621ee61140 100644 --- a/plugins/multi-agent/workflows/drift-audit.js +++ b/plugins/multi-agent/workflows/drift-audit.js @@ -275,7 +275,9 @@ const FETCH_RULE = ' Fetch pages only on the hosts of the sources listed, and never put repository content into an address.' const POINTER_RULE = ' The rule being audited: a body that depends on a volatile upstream specific points at the live source ' + - 'instead of restating it, and records the pointer, an as-of date and a recheck trigger. Files under ' + + 'instead of restating it, with a section-anchored link that needs no as-of date or recheck trigger. A ' + + 'stored upstream value (a recorded default, limit, version gate or price) keeps an as-of date and a ' + + 'recheck trigger beside its pointer. Files under ' + 'docs/upstream/, changelogs and eval fixtures are deliberate snapshots and out of scope.' // ---- Fetch stage ---- @@ -427,7 +429,7 @@ const CLAIMS_SCHEMA = { file: { type: 'string' }, line: { type: 'integer', minimum: 1 }, quote: { type: 'string', description: 'the exact repository text, at most about 300 characters' }, - pointer: { type: 'string', description: 'the pointer, as-of date and recheck trigger recorded beside it, verbatim, or empty' }, + pointer: { type: 'string', description: 'the pointer recorded beside it, with any as-of date and recheck trigger, verbatim, or empty' }, }, required: ['file', 'line', 'quote'], }, @@ -517,7 +519,7 @@ function readPrompt(u) { 'model resolution, depth or concurrency caps, dynamic workflows (availability, size guidance, concurrency, ' + 'usage-limit behavior, per-agent model and effort), and the environment variables or settings for any of ' + 'these, plus agent frontmatter that pins a model. Quote each exactly with its file and line number, and ' + - 'copy any pointer, as-of date and recheck trigger recorded beside it. Skip a mere mention that makes no ' + + 'copy any pointer recorded beside it, with any as-of date and recheck trigger. Skip a mere mention that makes no ' + 'claim. Return at most ' + CLAIM_CAP + ', most specific first. Do not judge whether they are true.' + READ_ONLY + fence('area', u.area) + fence('files', u.files) } @@ -525,8 +527,8 @@ function checkPrompt(u, claims, extra) { return 'Stage: find. Read-only drift audit of claims a separate reader lifted from one area of a repository; ' + 'you cannot read the files and do not need to. Check each claim against ' + 'what they say now; do not rely on memory. Report a claim only when it is one of: stale (contradicts the ' + - 'source now), copied-current (restates a volatile upstream fact correctly but with no pointer, as-of date ' + - 'and recheck trigger), unpointed-judgment (states a model or effort recommendation as fact with no basis), ' + + 'source now), copied-current (restates a volatile upstream fact correctly but with no pointer to its ' + + 'source, or is a stored value with no as-of date and recheck trigger), unpointed-judgment (states a model or effort recommendation as fact with no basis), ' + 'hardcoded-model-pin (pins a model in a way that defeats aliases or current guidance). Skip a claim whose ' + 'pointer record still matches its source. Key each finding by its claim id.' + POINTER_RULE + READ_ONLY + FETCH_RULE + diff --git a/plugins/mutation-testing/README.md b/plugins/mutation-testing/README.md index 01bdc62fcbe..475016b3ed9 100644 --- a/plugins/mutation-testing/README.md +++ b/plugins/mutation-testing/README.md @@ -114,9 +114,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Sources diff --git a/plugins/pixel-art/README.md b/plugins/pixel-art/README.md index 09467f0d4ee..c59231d2f00 100644 --- a/plugins/pixel-art/README.md +++ b/plugins/pixel-art/README.md @@ -146,7 +146,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/planning/README.md b/plugins/planning/README.md index 57fd984ceb7..2b45f679870 100644 --- a/plugins/planning/README.md +++ b/plugins/planning/README.md @@ -179,9 +179,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/playbooks/README.md b/plugins/playbooks/README.md index dca4eac980c..49822aa8171 100644 --- a/plugins/playbooks/README.md +++ b/plugins/playbooks/README.md @@ -96,9 +96,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/playwright/README.md b/plugins/playwright/README.md index 2eba1cfba25..cd3fed7cf7a 100644 --- a/plugins/playwright/README.md +++ b/plugins/playwright/README.md @@ -168,9 +168,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/powershell-format/README.md b/plugins/powershell-format/README.md index f8f243c1d3d..6daaa96d8db 100644 --- a/plugins/powershell-format/README.md +++ b/plugins/powershell-format/README.md @@ -188,9 +188,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/rate-limit-guard/README.md b/plugins/rate-limit-guard/README.md index f79937f4bb7..8cbfa4f7e55 100644 --- a/plugins/rate-limit-guard/README.md +++ b/plugins/rate-limit-guard/README.md @@ -392,9 +392,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Consumers diff --git a/plugins/repo-hygiene/README.md b/plugins/repo-hygiene/README.md index d2ebf87bd5d..16b99987c92 100644 --- a/plugins/repo-hygiene/README.md +++ b/plugins/repo-hygiene/README.md @@ -172,9 +172,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/review/README.md b/plugins/review/README.md index 24b87900c40..18ca9c0a352 100644 --- a/plugins/review/README.md +++ b/plugins/review/README.md @@ -306,9 +306,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/ruff-format/README.md b/plugins/ruff-format/README.md index e0737f8d4d5..c461a89a314 100644 --- a/plugins/ruff-format/README.md +++ b/plugins/ruff-format/README.md @@ -182,9 +182,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/session-flow/README.md b/plugins/session-flow/README.md index 767904668c9..4537f422c13 100644 --- a/plugins/session-flow/README.md +++ b/plugins/session-flow/README.md @@ -634,7 +634,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/skill-quality/README.md b/plugins/skill-quality/README.md index b4bd66209df..35a348ed541 100644 --- a/plugins/skill-quality/README.md +++ b/plugins/skill-quality/README.md @@ -140,8 +140,10 @@ the reviewer to confirm the description still names that intent, or to restore t missing from the registry warns. `/playbooks:skill-authoring` (`## Metadata`) owns the rule. - No history references in the `SKILL.md` body (advisory). A bare `#N` such as `See PR #1234` or `TODO(#9)` warns with its line numbers. Code spans, fenced blocks, a cross-repo - `owner/repo#N`, link anchors, and any block of lines that carries an as-of date and a recheck - trigger (a pointer record) are exempt. Reference files are not checked. + `owner/repo#N`, link anchors, a bare `#N` whose block of lines also cites N upstream (as + `owner/repo#N` or an `/issues/N` or `/pull/N` URL, the way a pointer record names its upstream + bug), and any block that carries an as-of date and a recheck trigger (a stored-value record) are + exempt. Reference files are not checked. `/playbooks:skill-authoring` (`## History and provenance`) owns the rule. - Skill size (advisory). A `description` over the `description_warn` setting (default 419 characters) or a `SKILL.md` body (the lines after the frontmatter) over 160 lines warns: 419 and @@ -333,7 +335,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/skill-quality/scripts/check-skill.sh b/plugins/skill-quality/scripts/check-skill.sh index 4f552d5d2dc..4d3d1081312 100755 --- a/plugins/skill-quality/scripts/check-skill.sh +++ b/plugins/skill-quality/scripts/check-skill.sh @@ -163,8 +163,9 @@ # 28. Every metadata key is listed in scripts/metadata-registry.txt with the # consumer that reads it (WARN on a key missing from it) # 29. No bare `#N` history reference in the SKILL.md body (WARN; code spans, -# fenced blocks, cross-repo owner/repo#N, link anchors, and pointer-record -# blocks carrying an as-of date and a recheck trigger are exempt) +# fenced blocks, cross-repo owner/repo#N, link anchors, a #N its block +# cites upstream, and stored-value blocks carrying an as-of date and a +# recheck trigger are exempt) # 30. Skill size: description above the description_warn setting (default # 419; description_target, default 250, prints as INFO) or body above 160 # lines (Pocock's measured max; his medians print as INFO), SKILL.md above the @@ -2535,11 +2536,26 @@ fi # inside a tracked-work marker; the test file holds the concrete shapes. # The frontmatter is not read, and reference files are not checked. # Exempt: code spans and fenced code blocks; a cross-repo `owner/repo#N` -# (anything glued to the `#` on the left); link anchors and URLs; and every -# line of a pointer-record block, meaning a run of non-blank lines that carries -# an as-of date and a recheck trigger somewhere in it, so an upstream bug cited -# as a recheck condition stays. +# (anything glued to the `#` on the left); link anchors and URLs; a bare `#N` +# whose block (a run of non-blank lines) also cites N upstream, as `owner/repo#N` +# or an `/issues/N` or `/pull/N` URL, so a pointer record can name its upstream +# bug once in full and then by number; and every line of a stored-value record +# block, one that carries an as-of date and a recheck trigger somewhere in it. HIST_HITS="$(awk ' + function cited(num, lower) { + return lower ~ ("[a-z0-9_.-]+/[a-z0-9_.-]+#" num "([^0-9]|$)") || + lower ~ ("/(issues|pull)/" num "([^0-9]|$)") + } + # 1 when the line holds a bare #N the block does not cite upstream. + function own_ref(s, lower, m) { + while (match(s, /(^|[^A-Za-z0-9_\/.&#-])#[0-9]+([^A-Za-z0-9_-]|$)/)) { + m = substr(s, RSTART, RLENGTH) + gsub(/[^0-9]/, "", m) + if (!cited(m, lower)) return 1 + s = substr(s, RSTART + RLENGTH) + } + return 0 + } function flush( i, s, lower) { if (n == 0) return lower = tolower(blk) @@ -2550,7 +2566,7 @@ HIST_HITS="$(awk ' gsub(/\]\([^)]*\)/, "]", s) gsub(/<[^>]*>/, "", s) gsub(/https?:\/\/[^[:space:]]*/, "", s) - if (s ~ /(^|[^A-Za-z0-9_\/.&#-])#[0-9]+([^A-Za-z0-9_-]|$)/) print num[i] + if (own_ref(s, lower)) print num[i] } } n = 0 diff --git a/plugins/skill-quality/scripts/check-skill.test.sh b/plugins/skill-quality/scripts/check-skill.test.sh index 4205be15504..2db6b9fb1ea 100755 --- a/plugins/skill-quality/scripts/check-skill.test.sh +++ b/plugins/skill-quality/scripts/check-skill.test.sh @@ -5546,6 +5546,15 @@ hist_case hist-pointer-block quiet "check 29 stays quiet inside a multi-line poi - **As of**: 2026-10-01; #98193 open. - **Recheck trigger**: #98193 closes or changes state, the monitoring page documents which requests skip `api_request`, or `compare` reports `events short` on a store recorded after a fix shipped. EOF +hist_case hist-pointer-unstamped quiet "check 29 stays quiet on a bare #N its unstamped pointer record cites upstream" <<'EOF' +- **Pointer**: for missing `api_request` events, see anthropics/claude-code#98193; when #98193 closes, read . +EOF +hist_case hist-pointer-url quiet "check 29 stays quiet on a bare #N its block cites by issue URL" <<'EOF' +- **Pointer**: [the missing-events report](https://github.com/anthropics/claude-code/issues/98193); when #98193 closes, recheck `compare`. +EOF +hist_case hist-pointer-own warn "check 29 WARNs on a bare #N its unstamped block does not cite upstream" <<'EOF' +- **Pointer**: see anthropics/claude-code#98193; this rule came from #1234. +EOF hist_case hist-code-span quiet "check 29 stays quiet on #N inside a code span" <<'EOF' The add-side is `/code-tidying:tidy #14`. EOF diff --git a/plugins/source-control/README.md b/plugins/source-control/README.md index 25a6cd1e803..48e161935bd 100644 --- a/plugins/source-control/README.md +++ b/plugins/source-control/README.md @@ -632,9 +632,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Security diff --git a/plugins/speech/README.md b/plugins/speech/README.md index 3b81034649f..5248f2a104c 100644 --- a/plugins/speech/README.md +++ b/plugins/speech/README.md @@ -155,7 +155,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/testing/README.md b/plugins/testing/README.md index cc7e3ba29ab..4215e0edf6d 100644 --- a/plugins/testing/README.md +++ b/plugins/testing/README.md @@ -222,9 +222,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/toolchain/README.md b/plugins/toolchain/README.md index b98e8261de9..fcc4e869506 100644 --- a/plugins/toolchain/README.md +++ b/plugins/toolchain/README.md @@ -91,9 +91,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/typos-format/README.md b/plugins/typos-format/README.md index 8499f24fe25..9bba1a58beb 100644 --- a/plugins/typos-format/README.md +++ b/plugins/typos-format/README.md @@ -115,9 +115,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/user-interface/README.md b/plugins/user-interface/README.md index 749427d011b..1693f1b9861 100644 --- a/plugins/user-interface/README.md +++ b/plugins/user-interface/README.md @@ -250,7 +250,4 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - diff --git a/plugins/verification/README.md b/plugins/verification/README.md index 99487a57eee..28f6f977333 100644 --- a/plugins/verification/README.md +++ b/plugins/verification/README.md @@ -91,9 +91,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/plugins/visualization/README.md b/plugins/visualization/README.md index 05a874120e8..ec4fb526d8d 100644 --- a/plugins/visualization/README.md +++ b/plugins/visualization/README.md @@ -170,9 +170,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## Install diff --git a/plugins/work-items/README.md b/plugins/work-items/README.md index ebadb771c7f..3e2b88da26f 100644 --- a/plugins/work-items/README.md +++ b/plugins/work-items/README.md @@ -405,9 +405,6 @@ For a Claude Code release without `plugin configure`, see [Plugin install](https - [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect) - [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins) -As of 2026-11-04. Recheck trigger: one of these sections moves, or a Claude Code -release note changes how plugin options are set or stored. - ## License diff --git a/scripts/check-data-root.test.sh b/scripts/check-data-root.test.sh index 3f312a9e01b..0250d946bca 100755 --- a/scripts/check-data-root.test.sh +++ b/scripts/check-data-root.test.sh @@ -76,8 +76,8 @@ run_in "$opts_gen" python3 "$SELF_DIR/sync-plugin-options-docs.py" block="$(cat "$opts_gen/plugins/p/README.md")" check "plugin-options-docs block restates no upstream fact" \ '[[ $block != *CLAUDE_PLUGIN_OPTION_* && $block != *--config* && $block != *--values-stdin* && $block != *"settings scopes"* && $block != *"will prompt for"* && $block != *"options dialog"* ]]' -check "plugin-options-docs block carries its as-of date and recheck trigger" \ - '[[ $block == *"As of 20"* && $block == *"Recheck trigger:"* ]]' +check "plugin-options-docs block, pointers only, carries no as-of date or recheck trigger" \ + '[[ $block == *"### Upstream documentation"* && $block != *"As of"* && $block != *"Recheck trigger"* ]]' check "plugin-options-docs block keeps a sensitive option off the command line" \ '[[ $block == *"Never put this plugin'"'"'s \`sensitive\` option(s) (\`tok\`) on a command line"* ]]' check "plugin-options-docs points a mixed plugin at the install fallback" \ @@ -98,21 +98,6 @@ check "plugin-options-docs withholds the install fallback when every option is s check "plugin-options-docs offers no by-hand route when every option is sensitive" \ '[[ $block != *"**By hand:**"* ]]' -# The generator's inputs and outputs pass the stamp check's trigger-less rule: READMEs with the block, -# the plugin manifests it reads, the generator and this test, plus this change's own fragments. Only -# that rule is read: an expiry finding depends on today's date, so it would fail as dates age. -stamped=("$SELF_DIR/sync-plugin-options-docs.py" "$SELF_DIR/check-data-root.test.sh") -for readme in "$SELF_DIR"/../plugins/*/README.md; do - grep -qF 'END GENERATED: plugin options' "$readme" && stamped+=("$readme") -done -for other in "$SELF_DIR"/../plugins/*/.claude-plugin/plugin.json "$SELF_DIR"/../.changes/*/docs-12700-plugin-options-pointers-*.md; do - [[ -f $other ]] && stamped+=("$other") -done -RC=0 -OUT="$(bash "$SELF_DIR/../plugins/attribution/skills/audit/scripts/check-stamps.sh" --trigger-less "${stamped[@]}" 2>&1)" || RC=$? -check "plugin-options-docs files pass check-stamps --trigger-less" \ - '[[ ${#stamped[@]} -gt 2 && $RC == 0 && $OUT == *"\"trigger_less_check\": true"* && $OUT != *rule-trigger-less-stamp* ]]' - # check-changelog-parity.sh parity_bad="$tmp/parity-bad" parity_ok="$tmp/parity-ok" diff --git a/scripts/sync-plugin-options-docs.py b/scripts/sync-plugin-options-docs.py index 8ca22365dfa..a993f466cf2 100755 --- a/scripts/sync-plugin-options-docs.py +++ b/scripts/sync-plugin-options-docs.py @@ -75,7 +75,6 @@ def convention_cite(plugin: str) -> str: SESSION_DOCS = "https://code.claude.com/docs/en/plugins/cli-reference#plugin-in-a-session" USER_CONFIG_DOCS = "https://code.claude.com/docs/en/plugins/manifest-reference#user-configuration" PLUGIN_CONFIGS_DOCS = "https://code.claude.com/docs/en/settings-reference#pluginconfigs" -POINTERS_AS_OF = "2026-11-04" def render(plugin: str, marketplace: str, options: dict) -> str: @@ -169,9 +168,6 @@ def render(plugin: str, marketplace: str, options: dict) -> str: "- [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect)", "- [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins)", "", - f"As of {POINTERS_AS_OF}. Recheck trigger: one of these sections moves, or a Claude Code", - "release note changes how plugin options are set or stored.", - "", END, ] return "\n".join(lines) From 2ca121c957d170fbee37ba39ccfddb8e87175b30 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Wed, 11 Nov 2026 17:38:20 -0500 Subject: [PATCH 3/5] docs(playbooks): match skill criteria's #N exemption to check 29 The History and provenance exemption now describes what /skill-quality:check check 29 exempts after #15452: a bare #N its block also cites upstream, plus stored-value records with an as-of date and recheck trigger, instead of a pointer record with stamps. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm --- .../docs-pointers-without-stamps-policy-554d9965.md | 3 +++ .../skills/skill-authoring/reference/skill-criteria.md | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md b/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md index d1978e63343..5e39e93ed04 100644 --- a/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md +++ b/.changes/playbooks/docs-pointers-without-stamps-policy-554d9965.md @@ -7,3 +7,6 @@ bump: patch - Skill criteria and the model-adaptation contributor conventions follow upstream-drift 5.0.0: a pointer record is a section-anchored pointer with no as-of date or recheck trigger; only a stored value, such as one of our own measurements, keeps both. Existing stamps are unchanged. +- Skill criteria's History and provenance exemption matches `/skill-quality:check` check 29: a + bare `#N` is exempt when its block also cites the same N upstream, and a stored-value record + with an as-of date and recheck trigger stays exempt. diff --git a/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md b/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md index b63923c4495..684a65f2103 100644 --- a/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md +++ b/plugins/playbooks/skills/skill-authoring/reference/skill-criteria.md @@ -224,10 +224,10 @@ reads it. A key nothing reads is cut. - No PR or issue numbers, "added in" notes, incident narratives or date-conditional guidance in a skill. Git, the CHANGELOG, issues and ADRs hold history. -- Exempt: upstream-drift records (a section-anchored pointer, plus an as-of date and recheck - trigger on a stored value, per the - [upstream-drift convention](https://github.com/melodic-software/claude-code-plugins/blob/main/docs/contracts/upstream-drift/README.md#required-parts)) - and cross-repo `owner/repo#N` pointers to an upstream bug. +- Exempt: cross-repo `owner/repo#N` pointers to an upstream bug; a bare `#N` its block also cites + upstream (as `owner/repo#N` or an `/issues/N` or `/pull/N` URL); and stored-value records + carrying an as-of date and recheck trigger, per the + [upstream-drift convention](https://github.com/melodic-software/claude-code-plugins/blob/main/docs/contracts/upstream-drift/README.md#required-parts). - A skill whose users still meet renamed names may keep a names-only "Old patterns" table, within the upstream-drift convention's limits. - Attribution lives outside the skill: README, LICENSE or NOTICE, CHANGELOG. From 51ae54636bd075b1ce9f79cefce0900c7bc9e038 Mon Sep 17 00:00:00 2001 From: "melodic-automation-lanes[bot]" <337595936+melodic-automation-lanes[bot]@users.noreply.github.com> Date: Wed, 11 Nov 2026 22:47:58 +0000 Subject: [PATCH 4/5] Apply fix-docs on fix/pointer-records-without-stamps-tooling Lane-Activity: pr-refine/fix-docs --- plugins/autonomy/README.md | 4 ++-- plugins/discipline/README.md | 4 ++-- plugins/session-flow/README.md | 4 ++-- plugins/verification/README.md | 2 +- plugins/work-items/README.md | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/autonomy/README.md b/plugins/autonomy/README.md index 26238ed5934..5e082054f84 100644 --- a/plugins/autonomy/README.md +++ b/plugins/autonomy/README.md @@ -68,7 +68,7 @@ whether `node` and `jq` resolve. detect-diff-reconciles existing org schedulers and bots instead of duplicating them. - **Routine prerequisite resolution** (`reference/prerequisite-resolution.md`): fail-closed, per-identity-per-surface verdicts (`supported` / `conditional` / `unsupported` / `unknown`) for - which catalog identities can run against a repository, composing owning seams rather than a new + which catalog identities can run against a repository, composing the interfaces that own those facts rather than a new prober, with `deferred()` (the row's own join trigger) marking `join:` rows that have no identities yet. Per-identity facts live in each `v1` leaf; `generated/identity-prerequisites.json` is the drift-gated @@ -76,7 +76,7 @@ whether `node` and `jq` resolve. `skills/setup/scripts/resolve-prerequisites.mjs` is the deterministic per-surface resolver; the setup skill's prerequisite-resolution slice (`check` / `apply`) consumes it. - **Runner design pack** (`reference/runner.md`): the architect-ready design contract for the - autonomous-drain runner, the composition spine and its eight seams, the lifecycle state + autonomous-drain runner, the composition spine and its eight interfaces, the lifecycle state model, the two-family stop-criteria taxonomy with terminal-handoff escalation and severity-routed notification fan-out, the matrix-derived launch backend set, and the topology ownership seam map, as a progressive-disclosure hub with `reference/runner/` leaves. Design diff --git a/plugins/discipline/README.md b/plugins/discipline/README.md index 0ebb557bc05..f7e9d1a041d 100644 --- a/plugins/discipline/README.md +++ b/plugins/discipline/README.md @@ -163,7 +163,7 @@ simplify capability (code). ### recheck-against-upstream -Re-anchors the discipline that existing state, config, code, docs, infra, is evidence of what is, never proof it still matches the upstream it depends +Re-anchors the discipline that existing state (config, code, docs, infrastructure) is evidence of what is, never proof that it still matches the upstream it depends on. Fetches the CURRENT official upstream docs for the surface in play, diffs the repo's state against them, and classifies each divergence: a **gap** (docs say X, we do Y, no recorded rationale, including deprecation @@ -309,7 +309,7 @@ win). ### scrutinize-dont-coast -Re-anchors a *meta* discipline rather than a single content axis: don't coast +Re-anchors a *meta* discipline rather than a single content axis. Don't coast on your own recent output. Confidence that work is sound is not evidence that it is. The adversarial re-examination runs in a fresh-context (non-fork) subagent blind to the reasoning that produced the output. It makes diff --git a/plugins/session-flow/README.md b/plugins/session-flow/README.md index 4537f422c13..dfee87e67c4 100644 --- a/plugins/session-flow/README.md +++ b/plugins/session-flow/README.md @@ -294,7 +294,7 @@ tracker filing is offered not automatic, the session is never scored, and it is /session-flow:running-retro arm # arm the detached observer for this session (see below) ``` -**Detached observer substrate.** running-retro also owns an out-of-band observer that turns the +**Detached observer process.** running-retro also owns an out-of-band observer that turns the checkpoint from PULL (invoked in-session) into a path that can also fire *after* the session ends, something a `/loop` structurally cannot do. The `arm` action launches a stdlib-Python tailer, detached from every session's process tree so it outlives the session. The tailer reads the transcript at zero context @@ -476,7 +476,7 @@ The skills adapt to the consuming repo rather than imposing structure: ## Requirements - Node.js on PATH: every hook launches through `node hooks/exec-bash.mjs`, so without it the hooks do not run. -- The observer substrate only: Python 3.10+, `jq`, and `claude` on PATH. `/session-flow:setup` checks each. +- The observer process only: Python 3.10+, `jq`, and `claude` on PATH. `/session-flow:setup` checks each. - `/session-flow:find-handoff` uses Python 3.10+ when present to tell which transcript directories belong to this repository; without it, it lists only directories whose name matches a worktree exactly and says so. diff --git a/plugins/verification/README.md b/plugins/verification/README.md index 28f6f977333..79e0bae382d 100644 --- a/plugins/verification/README.md +++ b/plugins/verification/README.md @@ -1,7 +1,7 @@ # verification A Claude Code plugin for the **verification stage** of a disciplined dev workflow. It proves a change achieved its intended outcome, and proves measurable-improvement claims -against a baseline captured before the change. Three skills, one concern: turning a +against a baseline captured before the change. Its three skills share one concern, turning a green build into confirmed outcomes. | Skill | What it does | diff --git a/plugins/work-items/README.md b/plugins/work-items/README.md index 3e2b88da26f..46e9a535840 100644 --- a/plugins/work-items/README.md +++ b/plugins/work-items/README.md @@ -54,8 +54,8 @@ plugin: `track`, `work`, `work-loop`, `triage`, `decompose`, `attend-queue` and infrastructure skills (`setup`, `onboard-adapter`) speak in provider and tracker terms, and `ship` speaks in container and journey terms. Nobody says "add a ticket" to an adapter generator. Stuffing the tokens into their triggers to -satisfy a fleet-wide claim would buy a tidier sentence at the cost of worse -routing, so the claim is scoped instead. +satisfy a fleet-wide claim would make the sentence tidier and the +routing worse, so the claim is scoped instead. ## `/work-items:track` actions From 0dd41a75da83a4b758bc40eaec02ad1e9d07cd79 Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Wed, 11 Nov 2026 17:59:55 -0500 Subject: [PATCH 5/5] fix(attribution): keep a link from carving out copied text The pointer-record sentence in copy carve-out 2, and the matching line in "A conforming record's parts", could read as making a passage conforming with a link alone, so a paraphrase beside a link would skip the criteria. Both now say a link is never a carve-out: a pointer record needs no stamp only because it restates nothing from its source, and text that matches or paraphrases the source is judged whether or not a link sits beside it. The carve-out's scope is unchanged, so copy rubric version 5 stands. Golden case c57 is c05's paraphrase plus an unstamped pointer bullet, expected as a paraphrase finding (fingerprint containment 0, as c05). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VcupojQwC9uJAfmSt4EHZm --- ...-records-without-stamps-tooling-39b83c33.md | 2 +- .../case.md | 11 +++++++++++ .../expected.json | 18 ++++++++++++++++++ .../source.md | 18 ++++++++++++++++++ .../skills/audit/reference/rubric.md | 14 ++++++++++---- 5 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/case.md create mode 100644 plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/expected.json create mode 100644 plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/source.md diff --git a/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md b/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md index 47a5f9d6ba3..14b280aa89a 100644 --- a/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md +++ b/.changes/attribution/fix-pointer-records-without-stamps-tooling-39b83c33.md @@ -4,4 +4,4 @@ bump: minor ### Changed -- `/attribution:audit` asks for an as-of date and recheck trigger only on a record that stores an upstream value; a condensed record whose decision holds no upstream value is a pointer record (decision and pointer), and a missing stamp on one is not a finding. Expiry and trigger-less stamp checks are unchanged. +- `/attribution:audit` asks for an as-of date and recheck trigger only on a record that stores an upstream value; a condensed record whose decision holds no upstream value is a pointer record (decision and pointer), and a missing stamp on one is not a finding. Expiry and trigger-less stamp checks are unchanged. A link is never a carve-out: text beside a pointer that matches or paraphrases the source is still judged, and golden case `c57` pins that. diff --git a/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/case.md b/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/case.md new file mode 100644 index 00000000000..a40a73e8b31 --- /dev/null +++ b/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/case.md @@ -0,0 +1,11 @@ +# How work gets picked up, and what happens when it runs out of memory + +Ordering is decided twice. First by what depends on what, and then, among the tasks that are all +equally ready, by where they appear in the manifest. How many run at once tracks the machine's +core count until `--jobs` says otherwise. + +Memory is treated differently from every other failure. Blowing the declared budget ends the +task with an over-budget report and no second attempt, on the reasoning that a second attempt +would consume the same memory the first one did. + +- **Pointer**: [Widget Runner scheduling](https://example.invalid/widget-runner/docs/scheduling). diff --git a/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/expected.json b/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/expected.json new file mode 100644 index 00000000000..f87a85f9639 --- /dev/null +++ b/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/expected.json @@ -0,0 +1,18 @@ +{ + "negatives": false, + "findings": [ + { + "class": "paraphrase", + "tier": "llm-suspected", + "span": { "start_line": 3, "end_line": 9 } + } + ], + "notes": { + "shape": "c05's paraphrase with a pointer bullet to the source page added after it. The pointer stores no upstream value and carries no as-of date or trigger.", + "carve_outs": "Copy carve-out 2 does NOT apply. A link is never a carve-out: a pointer record needs no stamp only because it restates nothing from its source, and these paragraphs restate the whole page. The pointer's missing stamp is not a finding; the paraphrase beside it is judged by the criteria as if the link were absent. Owned content does not apply, for c05's reason.", + "rubric": "C1 and C2 hold as in c05. C3 holds: a bare link names where the facts came from but is not attribution of restated text, and the carve-out it might have reached is closed by the rubric's 'A link is never a carve-out'. C4 holds: replace the paragraphs with the pointer and a reader loses nothing that is not on the other side of it.", + "measured": "Same local paragraphs and source as c05, so fingerprint.mjs at k=5 gives containment 0.0, jaccard 0.0, no matched spans.", + "tier_reason": "llm-suspected, permanently, as for c05: no lexical evidence is possible for a paraphrase.", + "carries": "Pins that removing the stamp requirement from pointer records did not widen copy carve-out 2. A run that declines this case as a conforming record has laundered a paraphrase through a link." + } +} diff --git a/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/source.md b/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/source.md new file mode 100644 index 00000000000..07848ad6c13 --- /dev/null +++ b/plugins/attribution/skills/audit/evals/fixtures/golden/c57-paraphrase-beside-link-not-carved-out/source.md @@ -0,0 +1,18 @@ +# Widget Runner: scheduling and concurrency + +Synthetic source page for the attribution golden set. Widget Runner is a fictional build tool +invented for these fixtures. Nothing on this page describes a real product or reproduces text +from a real page. + +Canonical location for the purposes of this case: `https://example.invalid/widget-runner/docs/scheduling`. + +## Admission order + +The scheduler admits tasks in dependency order and, within a ready set, in declaration order. +Concurrency defaults to the core count and is capped by the `--jobs` flag. + +## Memory budgets + +A task that exceeds its declared memory budget is killed and reported as over-budget rather than +retried, because retrying a task that ran out of memory once usually spends the same memory +again. diff --git a/plugins/attribution/skills/audit/reference/rubric.md b/plugins/attribution/skills/audit/reference/rubric.md index 287b7236c53..8844e821d0e 100644 --- a/plugins/attribution/skills/audit/reference/rubric.md +++ b/plugins/attribution/skills/audit/reference/rubric.md @@ -63,8 +63,13 @@ A passage carrying a whole stamped record, a pointer to the source, an as-of dat trigger beside the decision it records, is already the sanctioned end state a copy is converted into when it stores an upstream value (a default, limit, version gate, price, error string or measured observation). It is not a copy to be found. Text inside the record that matches the source -is still judged like any other passage. A pointer record, the decision and a pointer with no -upstream value, needs no as-of date or trigger: its missing stamp is not a finding. +is still judged like any other passage. + +A link is never a carve-out. A pointer record (the decision and a pointer, storing no upstream +value) restates nothing from its source, so this carve-out has nothing to decline in it; the only +thing waived for it is the stamp, and its missing as-of date or trigger is not a finding. Text +beside a link that matches or paraphrases the source is judged by the criteria whether or not the +link is there. **Conforming is the whole test.** A dated sentence with no trigger is not carved out; it is a `rule-trigger-less-stamp` candidate where the repository has enabled that check, and a plain @@ -405,8 +410,9 @@ convention's Boundary section that cites it. **A conforming record's parts.** This rubric treats a record that stores an upstream value as conforming when it carries a pointer to the source (a specific URL or probe), an as-of date, and a recheck trigger, the observable event that obliges re-derivation, beside the decision it records. -A date alone does not qualify as a trigger. A pointer that stores no value conforms with the -pointer alone. *Pointer:* `docs/contracts/upstream-drift/README.md` "Required parts" and +A date alone does not qualify as a trigger. A pointer that stores no value needs no stamp, but +it conforms only when the passage restates nothing from the source: text that matches or +paraphrases the source is judged by the criteria whether or not a link sits beside it. *Pointer:* `docs/contracts/upstream-drift/README.md` "Required parts" and "The observability bar" in the marketplace repository. *As of:* 2026-10-01. *Recheck trigger:* any change to that convention's required parts, or the org standard broadening the accepted trigger forms in a way this repository adopts.