Skip to content

chore(plugins): 12 unstamped upstream harness claims across 11 plugins — upstream-drift adoption backlog #2297

Description

@kyle-sexton

Fleet sweep run as row 2 of #2273. docs/conventions/upstream-drift/ requires a restated
upstream-owned specific to carry four parts — claim, basis (URL/probe), as-of date, and a recheck
trigger naming an observable event. The convention "binds on touch". This issue records the
carriers the sweep found so each can adopt when its owning plugin is next changed.

architecture is not listed: it was the motivating case, was corrected and stamped in
architecture 0.5.1, and is now an Adopters row (#2207). Every carrier below sits outside that
lane's plugin fence, which is why they are filed rather than fixed.

Carriers

Ranked by whether a wrong value changes what the surface does.

  1. plugins/plugin-quality/skills/audit/references/component-types/hook.md:15 — "Exit-code
    semantics — PreToolUse: 0 allow, 2 block; PostToolUse: 2 shows stderr to Claude." Pure harness
    contract used as an audit criterion; no doc URL, no date anywhere in the file.
  2. plugins/desktop-notification/hooks/desktop-notification.sh:49 — "systemMessage-only: the
    Notification event has no additionalContext channel." An absence claim naming no corpus; it
    is the stated reason the script emits only systemMessage.
  3. plugins/actionlint/hooks/actionlint-check.sh:58 — "PostToolUse cannot block or undo the write
    (the tool already ran), so the guard protects nothing." Load-bearing for the advisory posture.
  4. plugins/claude-config/skills/audit/reference/required-permissions.md:195 and :198 — "Deny
    and ask rules are evaluated regardless of which decision a PreToolUse hook returns" / "A hook
    that exits 2 stops the tool call before permission rules are evaluated at all." Mixed file:
    it carries a permissions-page URL + "Verified 2026-07-26" at :38, but that stamp is scoped to
    the "Scope of a Read deny" section and does not reach the hook-ordering section. Drives audit
    severity verdicts.
  5. plugins/discovery/agents/researcher.md:109 and :111 — "the harness removes it outright at
    the nesting depth limit" / "a configurable default of three as of Claude Code v2.1.219 — tunable
    via CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH". A version-pinned fact with no URL, date, or
    trigger. Twin at plugins/discovery/agents/explorer.md:96-99.
  6. plugins/disk-hygiene/skills/clean/SKILL.md:381, :384, :361, :375 — "PreToolUse hooks DO
    fire for the PowerShell tool (2.1.218...)", "(CLAUDE_TOOL_NAME does not exist)", and two more
    version-pinned claims with no as-of date and no trigger. Note the sibling
    clean/reference/safety-model.md:243 carries the same PowerShell claim better stamped, so
    this is arguably a duplication to collapse toward the stamped record rather than a fresh stamp.
  7. plugins/claude-memory/skills/stateless/context/status.md:27 and :32
    "autoMemoryEnabled defaults to true", and "CLAUDE_CODE_DISABLE_AUTO_MEMORY overrides
    autoMemoryEnabled (docs)" — a citation reading literally "(docs)", with no page, URL, or date.
  8. plugins/context-guard/hooks/zone-crossing-inject.sh:6 and :25 — "systemMessage renders to
    the operator; additionalContext lands in the model's context", and "systemMessage is
    documented only as a message shown to the user, with nothing said about non-interactive runs".
    The second is a claim about what the upstream docs say, unstamped; the whole two-channel
    design rests on it.
  9. plugins/autonomy/hooks/lane-stop-gate.sh:132 and :135 — "Stop supports additionalContext"
    and "A subagent finishing is delivered as SubagentStop". No basis anywhere in the file.
  10. plugins/claude-ops/skills/plugins/SKILL.md:138, :142 — userConfig substitution "only when
    the key is explicitly set", with "verified 2026-07-23 against CC 2.1.218". Partially
    stamped
    : claim + probe basis + date, but no source URL and no recheck trigger.
  11. plugins/context-guard/hooks/zone-gate.sh:125 — "Claude starts matched tools in PARALLEL, so
    several PreToolUse hook processes run concurrently against one session's counter." The atomic
    counter exists because of it.
  12. plugins/session-flow/reference/observer.md:100 — "A SessionStart hook fires on every session
    start, including the observer's own analysis -p run." The re-entrancy guard rests on it.

Plugins with at least one firm carrier: plugin-quality, desktop-notification, actionlint,
claude-config, discovery, disk-hygiene, claude-memory, context-guard, autonomy,
claude-ops, session-flow.

One stamped-but-nonconforming case

plugins/discovery/skills/explore/SKILL.md:89-95 carries a probe date, a documented basis, and an
expiry — but names page slugs with no URL, and its trigger is "This caveat expires 2027-02-11.
Re-fetch both pages then." That is a bare date, the exact form the observability bar rejects.

Known limitation — this is a lower bound, not a census

The citation gate was file-level: any file containing a code.claude.com or
docs.anthropic.com URL anywhere was dropped from the carrier pass. Mixed files — one stamped
claim plus several bare harness assertions — are therefore structurally under-represented. Carrier
4 is the single one found by manually reopening a stamped file; roughly 300 files were dropped this
way, densest under claude-config/skills/audit/**, claude-memory/skills/audit/**, and
context-guard/reference/**. Closing that needs a section-scoped rather than file-scoped pass.

The sweep also did not search paraphrases. A claim worded without the vocabulary grepped for
(PostToolUse, ${CLAUDE_, settings.json, subagent, and so on) would not have been found.

Verified as conforming (so the sweep is not one-sided)

Twelve files carried both a doc URL and a dated stamp; four were read in full and conform:
claude-config/skills/audit/reference/audit-checklist.md:167,
claude-config/skills/audit-instructions/reference/criteria.md:444,
context-guard/reference/reader-contract.md:236, and
disk-hygiene/skills/clean/reference/safety-model.md:308.

Disposition

No single lane owns these. Each carrier adopts when its plugin is next touched, per the convention's
own on-touch rule; a plugin becomes an Adopters row only once it actually conforms, since that
table's third column is a promise to the reader. Enforcement was considered and deferred as a
recorded decision in upstream-drift 1.4.0 — the check the doc already named would not have caught
the motivating case, because that surface carried no stamp for a stamp-anchored grep to match.

Related

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions