Skip to content

docs: re-verify the dated upstream doc stamp corpus against live pages - #2187

Merged
kyle-sexton merged 3 commits into
mainfrom
gap/stamps
Aug 11, 2026
Merged

docs: re-verify the dated upstream doc stamp corpus against live pages#2187
kyle-sexton merged 3 commits into
mainfrom
gap/stamps

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

No linked issue

Summary

The repo carries 327 dated verification stamps (verified / fetched / as of 2026-MM-DD), spanning 2026-07-15 → 2026-08-08. PR #2169 re-verified only the ~8 claims a gate or check skill directly enforces. The rest had gone unread for up to four weeks — which is exactly the drift a dated stamp exists to surface. A stamp nobody re-reads is worse than no stamp: it advertises a currency the claim does not have.

This PR re-verifies 72 stamps against the live upstream pages and reports honestly on the 49 upstream claims it did not reach.

The method change that makes this pass different

Earlier passes fetched docs through WebFetch, which summarizes through a small model and truncates long pages. Under that route "the page doesn't say that" is a routine false negative, so no negative claim can be settled and no drift classification is safe.

This pass reads https://code.claude.com/docs/en/<page>.md, which returns the complete raw markdown source (content-type: text/markdown), and greps it:

page raw bytes
hooks.md 249,026
settings.md 290,489
changelog.md 525,429
sub-agents.md 96,094
plugins-reference.md 90,982

Every CONFIRMED claim below is backed by a verbatim grep -F match against the full page. Two negative claims are now assertable for the first time, because the whole page was in hand rather than a truncated slice:

  • docs/conventions/hook-observability/README.md — no native "verbose hooks" toggle exists.
  • plugins/claude-memory/skills/stateless/reference/official-guidance.md — no settings-precedence exception bullet names autoMemoryEnabled, CLAUDE_CODE_DISABLE_AUTO_MEMORY, or auto memory.

One caution for the next person: markdown link flattening causes false misses. Four sub-agents quotes appeared to have vanished until inspection showed the only difference was [fork](#fork-the-current-conversation) becoming a fork. All four were verbatim-intact. Grep on a link-free fragment.

Fix

Drift found and corrected (3)

1. scripts/check-silent-skips.sh — exit-0 stderr is not "discarded entirely".

The gate comment claimed exit-0 hook stderr is "discarded entirely". The hooks reference says:

Stderr from a hook that exits 0 goes to the debug log only, never the transcript, and Claude never sees it.

The debug log is the one place it survives. The gate's conclusion is untouched — a debug-only sink is not a visibility surface, so a >&2-only notice on an exit-0 skip path is still invisible to both user and agent. The comment now states what upstream states, and records the correction so the next reader does not re-derive it.

2. context-guard — the 2.1.132 token-semantics floor lost its upstream source.

reference/reader-contract.md quoted the statusline page as saying "Before v2.1.132 these were cumulative session totals". That sentence is no longer on the page, and the version number went with it. What the page still states is only the present-tense semantics the floor depends on — "Token counts currently in the context window, from the most recent API response".

The dead quote is replaced with an explicit sourcing-status note; scripts/statusline-tee.sh carries the same note at its cli_version comment.

The floor itself is deliberately unchanged. TOKEN_SEMANTICS_MIN_VERSION still gates the token shape at >= 2.1.132; no behaviour, test, or zone result moves. Dropping it could only widen which payloads the token shape trusts, and the misfire it guards against is silent — a pre-2.1.132 cumulative 170k in a 200k window reads as a perfectly plausible current occupancy and resolves dumb while the live context may be smart-zone. It stays as a conservative lower bound, now labelled as retained-not-doc-backed. Re-source before any change that relaxes it.

3. Both statusline-shim.sh copies cited a plugins-reference section that no longer exists.

The 14-day orphaned-cache grace period was attributed to a section titled "Plugin cache and file access". Upstream renamed it to "Plugin caching and file resolution" (cache root ~/.claude/plugins/cache). The behaviour cited is unchanged and still stated verbatim — but a citation whose section title has vanished cannot be followed, which is precisely the rot a dated stamp exists to expose. Both comments now name the current title and record the former one.

Scope correction (1)

docs/PLUGIN-PHILOSOPHY.md — the "Pages load-bearing for this document" stamp covered seven bullets, one of which is a melodic-software/standards file, not a Claude Code page. The refreshed stamp now says so explicitly instead of implying the whole list was re-checked. The six Claude Code pages were each re-fetched and confirmed to still carry the topics named beside them (Plugin manifest schema, Version management, Plugin caching and file resolution, Persistent data directory, Hooks in skills and agents, Tag plugin releases for version resolution, pluginConfigs read scopes).

Confirmed and re-dated (no claim changed)

docs/PLUGIN-PHILOSOPHY.md · docs/conventions/hook-observability/README.md · gate/hook/script comments in check-silent-skips.sh, post-compact-mark.sh, record-rate-limit-stop.sh, packet-seal.sh, destructive_guard.py, skill-reference-verify.sh, markdown-format.sh, typos-format.sh, check-structure.sh, both statusline-shim.sh · and skill bodies/references across claude-config, claude-memory, claude-ops, context-guard, discipline, disk-hygiene, guardrails, implementation, plugin-quality, rate-limit-guard, session-flow, work-items.

The densest single block, session-flow/skills/orchestrate/context/sources.md (13 stamps), was re-checked quote by quote against sub-agents, workflows, changelog, and whats-new/2026-w32. All still match. Its 0.22.2 finding is independently re-confirmed: the sub-agents page now states outright "There's no limit on the total number of subagents Claude can spawn over a session", and CLAUDE_CODE_MAX_SUBAGENTS_PER_SESSION appears nowhere on it.

Verification

Coverage — all 327 stamps accounted for

The first version of this table was wrong, and review caught it. It was built from a single-line regex, (verified|fetched|as of) 2026-[0-9]{2}-[0-9]{2}. This repo hard-wraps prose, so a stamp whose keyword ends one line and whose date begins the next is invisible to it — 30 stamps were hidden that way, and the denominator I published (291) was itself understated. The wrap-aware pattern is:

(verified|fetched|as of)\s*(?:
\s*(?:[#>*-]\s*)?)?(2026-\d{2}-\d{2})

Buckets below are disjoint and sum to the total; nothing is hidden in a residual.

Bucket Count Treatment
Dated 2026-08-10 (current) 104 72 refreshed by this PR after verbatim confirmation; 32 already current from PR #2169, #2184 and other in-flight work
CHANGELOG entries 69 Left alone. A CHANGELOG entry describes what was true when written — re-dating it would falsify the record
Upstream Claude Code doc — not re-checked 49 Honest gap. See below
Repo-internal claims (no external page) 47 Out of scope for a docs-currency pass — recorded gate runs, this repo's own probes
Non-upstream sources 25 platform.claude.com, claude.com/blog, github.com, git-scm.com — different corpus
docs/topics/** 29 Left alone. Records of what was true when written; Contract tier, gated
env-vars-cited 4 Skipped by assignment — a parallel agent owns that route
TOTAL 327

The brief estimated ~260; the wrap-aware regex above is the number.

The line I drew, stated before the work started

Verify, in order: (1) every docs/PLUGIN-PHILOSOPHY.md claim; (2) every code-comment claim inside a gate, hook, or script, since those are load-bearing for behaviour; (3) skill-body and reference claims on pages obtained in full. Deprioritize READMEs and CHANGELOGs as historical record, and leave docs/topics/** alone.

What that leaves unchecked: 49 upstream claims, thinly spread — docs/conventions/loop-lane/README.md (8), docs/MIGRATION-PLAYBOOK.md (4), docs/PLUGIN-PHILOSOPHY.md (3, each a stamp spanning a platform.claude.com page alongside Claude Code pages — see below), and playbooks/** (9, mostly platform.claude.com-adjacent model-calibration notes). No other file has more than 2. These are reachable by the same method and are the natural next slice; they were cut for depth over breadth, not because they are lower risk.

Three PLUGIN-PHILOSOPHY stamps cover several pages at once, at least one of them outside this corpus. Where I verified the Claude Code pages but not the platform.claude.com one under the same stamp, I left the date alone rather than refresh a stamp that also vouches for a page I did not open. The same rule produced the scope correction above.

No stamp was re-dated without a verbatim quote retrieved this session. Every one of the 12 stamps added in the review round was already backed by a quote pulled in the original sweep; none was newly assumed.

Every stamp in a file this PR claims to have verified now carries the new date. That was not true in the first push — review caught CHANGELOG entries asserting more than the diff delivered — and the wrap-aware regex above is what makes the claim checkable rather than assertable. Bumping a date on a claim I could not locate would launder an unverified claim into a fresh stamp — strictly worse than leaving it stale, and invisible to review. Where a claim could not be confirmed it kept its old date and sits in the 46.

Gates (CI form, committed tree)

  • bash scripts/check-contract-slice-prune.sh --check-diff origin/main — pass
  • bash scripts/check-changelog-parity.sh --check-bump origin/main — pass
  • bash scripts/check-skill-portability.sh origin/main — pass
  • npx markdownlint-cli2 <43 changed md files> — 0 errors
  • bash scripts/check-changed-skills.sh origin/main — pass (10 skills checked, 0 failed)

14 plugins touched, each patch-bumped with a ## [x.y.z] CHANGELOG entry. Pure-docs/ changes carry none. No docs/topics/<slug>/ created.

Related

@cursor

cursor Bot commented Aug 11, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bd81f9658f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread plugins/claude-memory/CHANGELOG.md Outdated
Comment thread plugins/session-flow/CHANGELOG.md
@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 51s —— View job


Security review — PR #2187

  • Gather context (PR diff via gh pr diff, custom instructions)
  • Review changed files for security issues
  • Post findings

Scope: All 58 changed files were reviewed against the diff (gh pr diff 2187). No .github/workflows/* files are touched by this PR.

Findings: none.

This PR is a pure documentation/comment/metadata pass:

  • Prose docs (docs/PLUGIN-PHILOSOPHY.md, docs/conventions/hook-observability/README.md, skill SKILL.md/reference files) — text and stamp-date edits only.
  • CHANGELOG.md files (14 plugins) — additive release notes, no executable content.
  • plugin.json files (14 plugins) — each is a single-line "version" bump (e.g. plugins/claude-memory/.claude-plugin/plugin.json); no changes to mcpServers, hooks, permissions, or any other contract field.
  • Shell/Python scripts (scripts/check-silent-skips.sh, context-guard's post-compact-mark.sh / statusline-shim.sh / statusline-tee.sh, disk-hygiene/.../destructive_guard.py, guardrails/hooks/skill-reference-verify.sh, markdown-format.sh, packet-seal.sh, rate-limit-guard/hooks/record-rate-limit-stop.sh / statusline-shim.sh, typos-format.sh, claude-config/.../check-structure.sh) — every hunk in every one of these files touches only comment text (re-dating a verified/fetched stamp, or rewording a citation to match a re-fetched upstream quote, e.g. scripts/check-silent-skips.sh#L27-L34 and plugins/context-guard/scripts/statusline-tee.sh#L100-L123). No control-flow, argument handling, quoting, exit-code, or trust-boundary logic changed in any script. Confirmed the reader-contract.md version-floor edit (plugins/context-guard/reference/reader-contract.md#L142-L479) is documentation-only — the TOKEN_SEMANTICS_MIN_VERSION >= 2.1.132 guard itself is explicitly stated as unchanged, and I did not find any diff to the enforcing code.

No injection surfaces, credential/token handling, authorization logic, workflow permissions, or dependency pins are touched anywhere in this diff — there is nothing in scope for this lane's threat model (logic flaws, access-control gaps, injection, secret handling, dangerous Actions patterns, supply-chain risk) to flag.

@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 23s —— View job


Review complete

Summary

This is a docs-currency pass re-verifying dated upstream-doc stamps across 14 plugins plus docs/. I read the full diff (gh pr diff 2187) and cross-checked it against CLAUDE.md's fresh-docs mandate and REVIEW.md's code-review-lane scope (correctness/documentation, not security). The mechanism is sound: exec-form-vs-summarized fetch distinction, the two genuinely new negative claims, and the honest 46-claim gap accounting all hold up on inspection.

Two findings — both independently confirmed, both corroborating pre-existing Codex review comments on this PR:

  1. plugins/claude-memory/skills/stateless/reference/official-guidance.mdinline comment. CHANGELOG.md's 0.7.1 entry claims all seven block quotes plus the file's own negative claim were re-checked and refreshed to 2026-08-10. Lines 126 (the negative), 138, 154, and 164 still read verified 2026-08-08 — only 6 of ~9 dated citations in the file actually moved.
  2. plugins/session-flow/skills/orchestrate/context/sources.mdinline comment. CHANGELOG.md's 0.22.3 entry claims all twelve remaining dated quotes in this file were re-checked, explicitly naming "the depth-limit Agent withholding" quote. That quote (the "Agent tool is withheld at the depth limit" line) still reads verified 2026-07-29. A file-wide grep confirms it's the only miss.

Both are narrow, mechanical misses (a handful of stamps not bumped) rather than fabricated verification — the surrounding claim text itself is unchanged and plausible, only the stamp/CHANGELOG-claim pairing is inconsistent. Given the PR's own stated bar ("no stamp was re-dated without a verbatim quote retrieved this session"), the CHANGELOG entries should match what the corpus actually shows, or vice versa.

No other overclaiming CHANGELOG entries were found — I grepped all 14 CHANGELOG diffs for similar "all N quotes"/"every quote" language and only these two made that strength of claim.

Verified myself: the two findings above, by reading the current file contents directly. Author-claimed and not independently verified by me: the gate results and npx markdownlint-cli2 output listed under "Gates" in the PR description, and the 297-occurrence/60-refreshed accounting (I did not re-run the git grep census).

Branch: gap/stamps

Comment thread plugins/session-flow/skills/orchestrate/context/sources.md
@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

kyle-sexton added a commit that referenced this pull request Aug 11, 2026
Review on #2187 (Codex and Claude, independently, on two different files)
caught the first pass over-claiming: CHANGELOG entries said every listed stamp
had been re-verified, while several stamps in those same files still carried
their old dates. Both reviewers were right, and the cause is worth recording
because it is the failure mode the PR was written to avoid.

ROOT CAUSE. The inventory regex was single-line:
`(verified|fetched|as of) 2026-[0-9]{2}-[0-9]{2}`. In a repo that hard-wraps
prose, a stamp whose keyword lands at the end of one line and whose date starts
the next is invisible to it. **30 stamps were hidden this way**, so the "291"
denominator in the original PR body was itself wrong. A second, plainer error
compounded it: the bump list was assembled by hand while reading, not derived
from a per-file inventory, so a handful of single-line stamps in files I had
verified were simply never listed.

The corrected wrap-aware regex finds 327 stamps, not 291.

WHAT CHANGED. Every stamp in a file this PR claims to have verified now
actually carries 2026-08-10 — 12 more of them, each already backed by a
verbatim quote retrieved in the same session, none newly assumed. The
CHANGELOG entries are narrowed to what moved. Left deliberately at their old
dates: narrative references to when something was previously read ("since the
2026-07-29 read", "read 2026-07-29"), which are history, not currency.

ONE MORE DRIFT, found while re-sweeping. Both `statusline-shim.sh` copies cited
the plugins reference section "Plugin cache and file access" for the 14-day
orphaned-cache grace period. Upstream renamed it to "Plugin caching and file
resolution". The behaviour is unchanged and still stated verbatim, but a
citation whose section title no longer exists cannot be followed — the exact
rot a dated stamp is supposed to expose. Both comments now name the current
title and record the former one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
@kyle-sexton kyle-sexton reopened this Aug 11, 2026
kyle-sexton added a commit that referenced this pull request Aug 11, 2026
Review on #2187 (Codex and Claude, independently, on two different files)
caught the first pass over-claiming: CHANGELOG entries said every listed stamp
had been re-verified, while several stamps in those same files still carried
their old dates. Both reviewers were right, and the cause is worth recording
because it is the failure mode the PR was written to avoid.

ROOT CAUSE. The inventory regex was single-line:
`(verified|fetched|as of) 2026-[0-9]{2}-[0-9]{2}`. In a repo that hard-wraps
prose, a stamp whose keyword lands at the end of one line and whose date starts
the next is invisible to it. **30 stamps were hidden this way**, so the "291"
denominator in the original PR body was itself wrong. A second, plainer error
compounded it: the bump list was assembled by hand while reading, not derived
from a per-file inventory, so a handful of single-line stamps in files I had
verified were simply never listed.

The corrected wrap-aware regex finds 327 stamps, not 291.

WHAT CHANGED. Every stamp in a file this PR claims to have verified now
actually carries 2026-08-10 — 12 more of them, each already backed by a
verbatim quote retrieved in the same session, none newly assumed. The
CHANGELOG entries are narrowed to what moved. Left deliberately at their old
dates: narrative references to when something was previously read ("since the
2026-07-29 read", "read 2026-07-29"), which are history, not currency.

ONE MORE DRIFT, found while re-sweeping. Both `statusline-shim.sh` copies cited
the plugins reference section "Plugin cache and file access" for the 14-day
orphaned-cache grace period. Upstream renamed it to "Plugin caching and file
resolution". The behaviour is unchanged and still stated verbatim, but a
citation whose section title no longer exists cannot be followed — the exact
rot a dated stamp is supposed to expose. Both comments now name the current
title and record the former one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
kyle-sexton and others added 2 commits August 10, 2026 21:10
The repo carries ~291 dated verification stamps (`verified`/`fetched`/`as of`
2026-MM-DD) spanning 2026-07-15 to 2026-08-08. PR #2169 re-verified only the
~8 claims a gate or check skill directly enforces; the rest had gone unchecked
for up to four weeks, which is exactly the drift a dated stamp exists to
surface. A stamp nobody re-reads is worse than no stamp: it advertises a
currency the claim does not have.

WHY THE VERIFICATION IS TRUSTWORTHY THIS TIME. Previous passes fetched pages
through WebFetch, which summarizes through a small model and truncates long
pages, so "the page does not say that" was a routine false negative and no
negative claim could be settled. This pass reads
`https://code.claude.com/docs/en/<page>.md`, which returns the complete raw
markdown source (hooks alone is 249 KB), and greps it. Every CONFIRMED claim
here is backed by a verbatim string match against the full page, and the two
negatives asserted below are sound because the whole page was in hand.

WHAT MOVED. 50 stamps on claims re-confirmed by verbatim quote had their dates
refreshed to 2026-08-10. Two claims are corrected:

- `scripts/check-silent-skips.sh` said exit-0 hook stderr is "discarded
  entirely". The hooks reference says it "goes to the debug log only, never the
  transcript, and Claude never sees it". The gate's conclusion is untouched — a
  debug-only sink is not a visibility surface — but the comment now states what
  upstream states.

- `context-guard`'s reader contract quoted a statusline sentence, "Before
  v2.1.132 these were cumulative session totals", that upstream has since
  removed. The dead quote is replaced with an explicit sourcing-status note.
  The 2.1.132 floor itself is deliberately kept: it is conservative, dropping it
  could only widen which payloads the token shape trusts, and the misfire it
  prevents is silent.

WHAT WAS NOT CHECKED, AND WHY. CHANGELOG entries and `docs/topics/**` records
describe what was true when written — re-dating them would falsify the record,
so they were read only to confirm that character and left alone. `env-vars`
claims were skipped by assignment. Claims sourced to platform.claude.com,
github.com, or this repo's own gate runs are outside a Claude Code docs pass.
Full coverage table in the PR body.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
Review on #2187 (Codex and Claude, independently, on two different files)
caught the first pass over-claiming: CHANGELOG entries said every listed stamp
had been re-verified, while several stamps in those same files still carried
their old dates. Both reviewers were right, and the cause is worth recording
because it is the failure mode the PR was written to avoid.

ROOT CAUSE. The inventory regex was single-line:
`(verified|fetched|as of) 2026-[0-9]{2}-[0-9]{2}`. In a repo that hard-wraps
prose, a stamp whose keyword lands at the end of one line and whose date starts
the next is invisible to it. **30 stamps were hidden this way**, so the "291"
denominator in the original PR body was itself wrong. A second, plainer error
compounded it: the bump list was assembled by hand while reading, not derived
from a per-file inventory, so a handful of single-line stamps in files I had
verified were simply never listed.

The corrected wrap-aware regex finds 327 stamps, not 291.

WHAT CHANGED. Every stamp in a file this PR claims to have verified now
actually carries 2026-08-10 — 12 more of them, each already backed by a
verbatim quote retrieved in the same session, none newly assumed. The
CHANGELOG entries are narrowed to what moved. Left deliberately at their old
dates: narrative references to when something was previously read ("since the
2026-07-29 read", "read 2026-07-29"), which are history, not currency.

ONE MORE DRIFT, found while re-sweeping. Both `statusline-shim.sh` copies cited
the plugins reference section "Plugin cache and file access" for the 14-day
orphaned-cache grace period. Upstream renamed it to "Plugin caching and file
resolution". The behaviour is unchanged and still stated verbatim, but a
citation whose section title no longer exists cannot be followed — the exact
rot a dated stamp is supposed to expose. Both comments now name the current
title and record the former one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 56s —— View job


Security review — PR #2187

  • Gather context (gh pr diff, custom instructions)
  • Review changed files for security issues
  • Post findings

Scope: Read the full diff for all 58 changed files (gh pr diff 2187, 1,325 lines). No .github/workflows/* files are touched.

Findings: none.

This PR is a pure documentation/comment/metadata pass — re-verifying dated upstream-doc citation stamps against live Claude Code docs pages. Confirmed by reading every hunk in the diff:

  • plugin.json files (14 plugins) — each hunk is a single-line "version" patch bump (e.g. plugins/context-guard/.claude-plugin/plugin.json). No changes to mcpServers, hooks, permissions, or any other contract field.
  • CHANGELOG.md files (14 plugins) — additive release notes only, no executable content.
  • Prose docs (docs/PLUGIN-PHILOSOPHY.md, docs/conventions/hook-observability/README.md, skill SKILL.md/reference files across 11 plugins) — text and citation-date edits only.
  • Shell/Python scriptsscripts/check-silent-skips.sh, context-guard's post-compact-mark.sh / statusline-shim.sh / statusline-tee.sh, disk-hygiene's destructive_guard.py, guardrails's skill-reference-verify.sh, markdown-format.sh, plugin-quality's packet-seal.sh, rate-limit-guard's record-rate-limit-stop.sh / statusline-shim.sh, typos-format.sh. Every hunk in every one of these touches only comment text — a re-dated verified/fetched stamp, a corrected quote (e.g. scripts/check-silent-skips.sh#L27-L34), or a renamed upstream section title (e.g. plugins/context-guard/scripts/statusline-shim.sh#L6-L13). No control-flow, argument handling, quoting, exit-code, or trust-boundary logic changed in any script — confirmed line-by-line, not just by category.
  • plugins/context-guard/reference/reader-contract.md — the largest single hunk (dropping a dead version-floor quote and adding a sourcing-status note). Explicitly documentation-only: TOKEN_SEMANTICS_MIN_VERSION >= 2.1.132 itself is unchanged in the enforcing code (not touched by this diff).

No injection surfaces, credential/token handling, authorization logic, workflow permissions, or dependency pins are touched anywhere in this diff. Nothing in scope for this lane's threat model (logic flaws, access-control gaps, injection, secret handling, dangerous Actions patterns, supply-chain risk) applies here.

Note: this PR already has two documentation-consistency findings from Codex and a prior code-review-lane pass (stamp/CHANGELOG-claim mismatches in claude-memory and session-flow), both since fixed by the author in 0730ae94 — those are correctness/doc-currency issues, not security, and outside this lane's scope.

Branch: gap/stamps

@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 50s —— View job


Review complete

  • Gather context (diff, CLAUDE.md, prior review threads)
  • Confirm the two previously-flagged stamp mismatches (Codex + Claude review) are actually fixed by commit eaa349e
  • Spot-check remaining stamp/CHANGELOG claims for the same over-claiming pattern
  • Review non-doc script/reference edits for correctness
  • Post findings

Summary

Reviewed git diff 72b199e..eaa349e (the two PR commits) against CLAUDE.md's fresh-docs mandate and the review-lane's correctness/alignment scope.

Both previously-flagged findings are fixed. I independently re-checked the current file contents (not just the diff):

  • plugins/claude-memory/skills/stateless/reference/official-guidance.mdgrep -n "2026-0[78]-\|2026-08-10" now shows every dated citation in the file at 2026-08-10; the four that were stuck at 2026-08-08 (lines 126, 138, 154, 164) all moved.
  • plugins/session-flow/skills/orchestrate/context/sources.md — all 12 verified 2026-08-10 citations are present, matching the "twelve remaining dated quotes" CHANGELOG claim; the depth-limit Agent-withholding quote (previously stuck at 2026-07-29) is now among them. The four lines still reading 2026-07-29 (88, 121, 126, 148) are narrative "as of the 2026-07-29 read" references, not currency stamps — consistent with the author's explanation, and correctly left alone.

Cross-checks that came back clean:

  • Plugin-version/CHANGELOG-version parity for all 14 touched plugins — every plugin.json version matches its CHANGELOG.md top entry (e.g. claude-memory 0.7.1, session-flow 0.22.3, context-guard 0.6.4).
  • context-guard/scripts/context-zone.sh:228TOKEN_SEMANTICS_MIN_VERSION="2.1.132" is untouched, matching the CHANGELOG's claim that the version floor itself didn't move, only its doc-sourcing status.
  • All 21 remaining "confirmed and re-dated" files diffed individually — every hunk is a stamp-date-only change; no claim text changed in any of them.
  • Grepped all 14 touched CHANGELOG diffs for other "all N" / "every quote" style claims (the pattern that broke on the first pass) — none of the remaining entries make that strength of claim, so there's nothing else with the same falsifiability risk.
  • The blockquote added to context-guard/reference/reader-contract.md:154-165 (sourcing-status note for the 2.1.132 floor) is well-formed Markdown and its content is internally consistent with the corresponding statusline-tee.sh comment.

One minor finding posted inline (context-guard/scripts/statusline-shim.sh:11, duplicated in rate-limit-guard/scripts/statusline-shim.sh at the same line): the appended sentence about the section rename wasn't re-wrapped, leaving one ~150-char comment line where the rest of the file wraps at ~78 chars. Not gate-breaking — no max_line_length rule is configured for .sh in .editorconfig — just a readability nit.

Not independently re-run: the gate/lint results listed under "Gates" in the PR description (check-contract-slice-prune.sh, check-changelog-parity.sh, check-skill-portability.sh, markdownlint-cli2, check-changed-skills.sh) — sandboxed shell execution in this environment required approval I couldn't grant myself, so those remain author-claimed. Correctness of the actual doc/CHANGELOG content was verified by direct file reads and greps against the checked-out tree, not by trusting the PR's own account of it.

No correctness or alignment issues beyond the one cosmetic nit above.

Comment thread plugins/context-guard/scripts/statusline-shim.sh Outdated
…e's width

The section-rename fix replaced text mid-sentence and left the tail appended to
the citation line, producing a ~133-char comment line in a file that hand-wraps
every other line near 78. Caught in review on #2187.

No gate enforces a shell comment width, which is exactly why this is worth
fixing by hand: the wrap is a readability convention the file keeps
consistently, and a single line breaking it is the kind of thing that erodes
the convention silently.

Comment text is unchanged; only the line break moves. Both copies of the shim
are corrected identically, since they carry the same block.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FdBsorqGjCU4Mg5nrmgz4m
@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 33s —— View job


Code review — PR #2187 (re-review after latest push)

  • Gather context (diff since last review, CLAUDE.md, REVIEW.md)
  • Confirm the re-wrap fix (commit bdab42b) actually resolves the prior line-length nit
  • Re-check the two previously-flagged stamp mismatches are still fixed
  • Review remaining files for correctness/alignment issues
  • Post findings and summary

Summary

This trigger fired on the synchronize event for commit bdab42b, which contains only the follow-up fix for the cosmetic line-wrap nit from the prior review pass. I diffed eaa349e..bdab42b directly and it touches exactly two files:

Verified myself, by direct inspection of the checked-out tree (not the author's account):

  • Both files: the previously ~150-char line is now split at the sentence boundary into two lines. Grepped both files for lines ≥100 chars — none remain. Comment text is byte-identical aside from the line break; no content changed.
  • Both previously-flagged stamp/CHANGELOG mismatches (Codex on claude-memory and session-flow, corroborated by the prior review-lane pass) remain fixed at this SHA: grep -n "verified 2026-0[78]-" against plugins/claude-memory/skills/stateless/reference/official-guidance.md and plugins/session-flow/skills/orchestrate/context/sources.md returns no stray hits — the four stamps at 126/138/154/164 and the depth-limit-Agent stamp are all 2026-08-10, matching what 0730ae94 claimed to fix.
  • Spot-read the full diffs of docs/PLUGIN-PHILOSOPHY.md, plugins/context-guard/reference/reader-contract.md, and scripts/check-silent-skips.sh against origin/main — every hunk is a date bump or a citation/wording correction consistent with the PR description's claims; no behavior or claim text drifted from what's described.
  • Checked bdab42b against plugins/context-guard/CHANGELOG.md / plugins/rate-limit-guard/CHANGELOG.md and both plugin.json files — untouched by this commit, which is correct: it's a pure re-wrap of a comment whose content was already covered by the prior version bump's changelog entry, so no new version claim is being made that needs a bump.

No new findings. This PR's only remaining open items were the two stamp mismatches and the line-wrap nit, all three now confirmed fixed. No inline comments to add.

Not independently re-run: the gate/lint results listed under "Gates" in the PR description (check-contract-slice-prune.sh, check-changelog-parity.sh, check-skill-portability.sh, markdownlint-cli2, check-changed-skills.sh) — sandboxed shell execution required approval I couldn't grant myself in this environment. Correctness of the actual doc/CHANGELOG content was verified by direct file reads and greps against the checked-out tree.

Branch: gap/stamps

@claude

claude Bot commented Aug 11, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 25s —— View job


Security review — PR #2187

  • Gather context (gh pr diff 2187, custom instructions)
  • Review changed files for security issues
  • Post findings

Scope: Read the full diff for all 58 changed files (gh pr diff 2187, 1,326 lines). No .github/workflows/* files are touched by this PR.

Findings: none.

This PR is a pure documentation/comment/metadata pass — re-verifying dated upstream-doc citation stamps against live Claude Code docs pages (code.claude.com/docs/en/*.md). I read every hunk in the diff individually, not just by file category:

  • plugin.json files (14 plugins) — every diff is exactly @@ -1,7 +1,7 @@, a single-line "version" patch bump (e.g. plugins/context-guard/.claude-plugin/plugin.json#L4). No changes to mcpServers, hooks, permissions, or any other contract field in any of the 14.
  • CHANGELOG.md files (14 plugins) — additive release notes only, no executable content.
  • Prose docs (docs/PLUGIN-PHILOSOPHY.md, docs/conventions/hook-observability/README.md, skill SKILL.md/reference files across 11 plugins) — text and citation-date edits only.
  • Shell/Python scriptsscripts/check-silent-skips.sh, context-guard's post-compact-mark.sh / statusline-shim.sh / statusline-tee.sh, disk-hygiene's destructive_guard.py, guardrails's skill-reference-verify.sh, markdown-format.sh, plugin-quality's packet-seal.sh, rate-limit-guard's record-rate-limit-stop.sh / statusline-shim.sh, typos-format.sh, claude-config's check-structure.sh. Every hunk in every one of these touches only comment text — a re-dated verified/fetched stamp, a corrected quote (e.g. scripts/check-silent-skips.sh#L27-L38), or a renamed upstream section title (e.g. plugins/context-guard/scripts/statusline-shim.sh#L6-L13). No control-flow, argument handling, quoting, exit-code, or trust-boundary logic changed in any script.
  • plugins/context-guard/reference/reader-contract.md — the largest single hunk (dropping a dead version-floor quote and adding a sourcing-status note at L145-L165). Explicitly documentation-only: TOKEN_SEMANTICS_MIN_VERSION >= 2.1.132 in the enforcing script (context-zone.sh) is not touched by this diff.

No injection surfaces, credential/token handling, authorization logic, workflow permissions, or dependency pins are touched anywhere in this diff. Nothing in scope for this lane's threat model (logic flaws, access-control gaps, injection, secret handling, dangerous Actions patterns, supply-chain risk) applies here.

Note: this PR has two documentation-consistency findings already raised by Codex and a prior code-review-lane pass (stamp/CHANGELOG-claim mismatches in claude-memory and session-flow), both fixed by the author in 0730ae94. Those are correctness/doc-currency issues, not security, and outside this lane's scope.
· Branch: gap/stamps

@kyle-sexton
kyle-sexton merged commit 47504d4 into main Aug 11, 2026
33 checks passed
@kyle-sexton
kyle-sexton deleted the gap/stamps branch August 11, 2026 01:28
kyle-sexton added a commit that referenced this pull request Aug 11, 2026
…scope (#2191)

No linked issue

## Summary

`upstream-drift` 1.2.0 shipped the fetch route yesterday
([#2185](#2185)).

[#2187](#2187)
applied it across 327
stamps today and surfaced **two holes in it**. Both are the route's own
failure mode — a false
absence carrying every outward sign of a good read — one scope up from
where 1.2.0 drew the line.

This is the convention's recheck discipline finding gaps in the
convention, one release after it
shipped. `upstream-drift` 1.2.0 → 1.3.0, additive; no required part,
canonical name, or
enforceability verdict changed. Pure `docs/`, so no plugin bump.

## Fix

### Hole 1 — a `200` does not mean you got the page you asked for

1.2.0's rung 1 guarded against truncation and against a channel that
404s. It did not guard against
a channel that **succeeds with the wrong page**. A retired slug is
silently aliased to its
successor — no redirect, no `Location`, no notice in the body:

| Probe | Result |
|---|---|
| `slash-commands.md` | `200`, `text/markdown`, 82,668 bytes, first
heading `# Extend Claude with skills` |
| `skills.md` | `200`, `text/markdown`, 82,668 bytes, same heading |
| SHA-256 of both |
`a833dd5c96b9b111de0daec5fc6436e210c8cdc009e51306d32438746db0b5a5` —
**byte-identical** |
| Rendered `slash-commands` | `200`, `num_redirects: 0` |
| `nonexistent-page-xyz.md` | `404` — so this is **not** a catch-all;
aliasing is specific to slugs that once existed |

**This outranks truncation as a failure.** Truncation at least yields
text you can see is short.
Here a search for a term the *requested* page owns comes back empty
against a full, healthy-looking
body. Identity is therefore now part of rung 1, with two cheap checks:

- **Confirm the slug against `llms.txt`.** Verified across ten slugs:
the nine live ones each
appear as `docs/en/<slug>.md`; `slash-commands` appears in no such entry
(only an unrelated
`agent-sdk/slash-commands`) — exactly the one that aliased. A mechanical
detector, not a judgment
  call.
- **Read the body's first heading before quoting it.** A heading that
does not match the page you
asked for ends the read. A title merely *worded* differently from the
slug does not —
`sub-agents.md` is titled "Create custom subagents", `costs.md` "Manage
costs effectively"; both
  are correct pages.

A missing slug is not a dead end — it is a prompt to find the successor
in the index and cite
**that** slug. Left unchecked, a citation of a retired slug keeps
working indefinitely while
pointing somewhere its author never read, then becomes a `404` on a
claim nobody re-derived the day
the alias is dropped.

### Hole 2 — an absence claim now carries its scope

1.2.0 said a truncated read supports no absence claim. It never said a
**complete** read of one page
supports no claim about the product. Two moves break it:

- **Widening the subject.** Searching `hooks` and concluding "Claude
Code has no X" asserts
something about every page not searched. The honest form names the
corpus: "not documented on
`hooks`" — or, if the sweep genuinely covered the index, "not documented
on any page listed in
  `llms.txt` as of `<date>`", a far larger and more expensive claim.
- **Searching the phrase instead of the capability.** Verified on
`hooks.md`: the phrase
  "verbose hooks" appears **zero** times, while the same page documents

> Async hook completion notifications are suppressed by default. To see
them, enable verbose mode
  > with `Ctrl+O` or start Claude Code with `--verbose`.

  and separately

> set `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` to see additional log lines
such as hook matcher
  > counts and query matching

A phrase search returns nothing here and licenses "no verbose hooks
toggle exists" — false, from a
  complete, untruncated read of the *right* page.

Stated as its own rule because it is the reason to care: **a sound
conclusion resting on a false
premise is fragile, not safe.** The instance above kept its conclusion
on a corrected premise

([#2190](#2190));
the next reader who
checks a false premise discards the conclusion with it. Fix the premise
and keep the conclusion —
never keep a premise because the conclusion it props up is convenient.

## Verification

Every claim above was re-derived here directly rather than taken on
report, per the rule this
section states — a report of an absence is exactly the thing the
convention says not to accept
second-hand:

- Both `.md` bodies fetched and hashed locally;
`slash-commands`/`skills` identity confirmed by
  matching SHA-256, byte count, and first heading
- Redirect behavior probed with `curl -L -w '%{num_redirects}'` on the
rendered URL
- `404` control run against an invented slug, establishing the alias is
not a catch-all
- `llms.txt` fetched (187 `docs/en/` entries) and checked slug-by-slug
across all ten
- `hooks.md` fetched in full; `grep -ic "verbose hooks"` → `0`, and all
four `verbose` mentions read
  verbatim
- Nine live pages fetched to confirm the title-vs-slug check does not
produce false positives

**Gates (committed tree, CI form):** `check-contract-slice-prune.sh
--check-diff origin/main`,
`check-changelog-parity.sh --check-bump origin/main`,
`check-skill-portability.sh`,
`check-shell-portability.sh` — all pass; `markdownlint-cli2` over both
changed files — 0 errors.
Remaining gates: CI is the authority.

## Related

-
[#2185](#2185)
— shipped the fetch
  route this patches
-
[#2187](#2187)
— applied it at scale
  and found both holes
-
[#2190](#2190)
— withdrew the
  over-scoped nonexistence claim that hole 2 generalizes

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
kyle-sexton added a commit that referenced this pull request Aug 11, 2026
…searched (#2190)

No linked issue

## Summary

PR #2187 claimed, as a headline result, that reading complete raw pages
made two negative claims assertable "for the first time". **One of them
was wrong**, and wrong in the way negative claims usually are: I
searched one page and stated the result about the product.

This corrects it. The rule it supports does not change; its
justification does.

## Fix

### The claim that was wrong

`docs/conventions/hook-observability/README.md` read:

> **Not a UI feature.** No native "verbose hooks" toggle exists in
Claude Code as of 2026-08-10 (confirmed against the same fresh fetch
this doc cites)

The literal phrase "verbose hooks" does appear on no page. But `verbose`
appears across **at least 13 Claude Code docs pages**, four of those
mentions on `hooks` itself — and one is squarely on point:

> Async hook completion notifications are suppressed by default. To see
them, enable verbose mode with `Ctrl+O` or start Claude Code with
`--verbose`.

A verbose mode that reveals hook output is precisely what the bullet
denied. Also present, none of it acknowledged:

| Surface | What it is |
| :-- | :-- |
| `verbose` setting | "Show full tool output instead of truncated
summaries" |
| `viewMode` setting | `"default"` / `"verbose"` / `"focus"` |
| `--verbose` flag | Full turn-by-turn output; overrides `viewMode` |
| `CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose` | Hook matcher counts and query
matching |
| `--include-hook-events` | Hook lifecycle events in the stream-json
feed |

### Why the rule still stands

None of those is a **consumer-facing toggle that makes an ordinary
hook's routine work visible**. Each is operator-driven debugging, a
transcript view the consumer must already have switched on, or a machine
feed for a `-p` harness. A plugin cannot depend on an operator's debug
posture, and none of them changes where a hook must *put* its message.

So `statusMessage` and `systemMessage` remain the surfaces a fleet hook
writes to, and no hook in the fleet changes. What changes is that the
rule now rests on "a plugin cannot assume an operator's debug posture"
instead of on a nonexistence claim that was false. A correct conclusion
resting on a false premise is fragile — the next person to check the
premise has reason to discard the conclusion with it.

### Second fix, same class

The same file attributed this to the hooks page:

> The harness's own signal for it is a generic "PostToolUse hook
modified `<file>` after your edit (likely a formatter)" line

That string appears on **no** Claude Code docs page. It is an observed
harness string, and the sentence read as though it had been verified
against the page cited beside it. It is now labelled as observed, and
the documented negative it sits next to — that the three output channels
carry no file-change or diff surface — is kept and separately
attributed, since that is the part the rule actually needs and it does
hold.

## Verification

- `verbose` occurrence counts taken across the full raw-markdown corpus
fetched via the rung-1 route in [`upstream-drift`, "Reading the
basis"](https://github.com/melodic-software/claude-code-plugins/blob/main/docs/conventions/upstream-drift/README.md#reading-the-basis--the-fetch-route):
13 pages carry it, `hooks.md` four times.
- The `Ctrl+O` / `--verbose` sentence quoted verbatim from `hooks.md`.
- "PostToolUse hook modified" and "likely a formatter" both return zero
matches across every page in the corpus.

Gates: `check-contract-slice-prune` pass · `check-changelog-parity
--check-bump` pass · `check-skill-portability` pass (no skill files in
scope) · `markdownlint-cli2` 0 errors. Pure `docs/` change — no plugin
version bump required.

## Related

- PR #2187 — introduced the claim this corrects, as one of its two
advertised negatives
- PR #2185 — established the rung-1 fetch route; its gotcha "absence
from one page is not absence" is what prompted re-checking my own merged
work, and is what caught this

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant