feat: claude-science + claude-tag product launches + archive pipeline fixes - #1215
Conversation
Housekeeping found the archive quietly diverging from upstream in three ways, none of which the 4x/day pipeline could report because all three look like success. 1. 159 files held an HTML soft-404 instead of docs, including all 135 of content/en/api/terraform/. The 2026-08-05 guard (PR #1139) stopped new ones being written but never removed those already on disk: each run refuses the write, counts a failure, and leaves the stale file. Terraform was additionally excluded from fetching, so it was invisible to both the guard and that cleanup. Re-probed all 159 upstream: 145 hard 404, 14 still soft-404, 0 recoverable. Deleted. 2. 1,560 platform docs stopped being refreshed on 2026-07-07. Upstream dropped every per-language SDK reference page from its sitemap *and* its llms.txt while continuing to edit the pages; the fetcher follows the sitemap, so they froze. en/api/python/messages/create.md was 35% smaller than upstream. Full runs now also refetch every doc already on disk, which recovered 1,268 files here. 3. claude.com/docs was never fetched at all: 215 pages of product docs (Claude Tag, Cowork, office agents, connectors, government, claude-science). sources.json still described the domain as cf-blocked marketing. Upstream had been 301-ing dead support articles there for weeks and nothing read the Location header; the fetcher now reports off-site redirects, which also surfaced academy.claude.com (725 pages, HTML-only, recorded but not fetched). Reaping is deliberately conservative: only files holding markup are deleted automatically. Real markdown whose URL died is content Anthropic removed and we may hold the only copy, so it is reported for a human -- content/en/resources/prompt-library/ (19 pages) is exactly that. A reap of more than 200 files is refused outright as an upstream outage rather than executed by a job that merges its own PRs. Also: strip #fragments from sitemap URLs (16 files had landed as `delete#delete.md`, all of them soft-404s), and drop 28 stale content/en/agent-sdk/ duplicates superseded by the canonical code.claude.com copies. stop-reasons.md is kept -- it is gone upstream and we hold the only copy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The refresh pass added in the previous commit fetches URLs the sitemap no
longer lists, which means it routinely follows redirects -- and
download_doc was writing the *target's* body to the *requested* path.
Silent misattribution, invisible in review because the content looks real.
94 files were affected:
- release-notes/system-prompts.md: upstream split it into per-model pages
today, so the old URL 307s to system-prompts/overview.md and our 471KB
prompt history was replaced by the 3.7KB overview. The 18 new per-model
files hold 467KB, so nothing was lost -- but the monolith path is now a
duplicate of overview.md and is removed.
- 93 MCP community pages: the project renamed community/<x>/charter to
community/{interest,working}-groups/<x>. Every one of those old paths had
been receiving the new page's body. Verified all 93 targets are on disk
and each old file was a byte-exact duplicate before removing it.
A redirect to a different path now records "moved -> <target>" and skips
the write. The target has its own entry in the fetch set, so it is still
archived; only the misattribution stops.
Also in this commit:
- tombstones.json: 187 URLs confirmed gone upstream, so a page that died
once is counted quietly instead of re-reported forever. Before this, 123
dead URLs failed on every run and pinned the success rate at 96.9%,
which is exactly the condition that hides the next real breakage.
Failed is now 0 and the rate is computed over live docs.
- The dead/failed split moved into _print_summary so every entry point
reports it; --section runs no longer rewrite tombstones.json, which
would have resurrected other sections' entries by omission.
- Newly-gone lines print the requested URL first. Printing the reason
first put "moved -> <target>" ahead of the source URL and the pair read
in the wrong order -- it misled me during this very investigation.
Verified over three consecutive full runs: newly-gone 0, known-dead 94,
tombstones byte-stable, 0 HTML shells, 0 fragment filenames, 0 dead
CLAUDE.md references, and every tombstoned "moved" target present on disk.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Conflicts were all fetcher-derived churn (63 support/ articles whose CDN image URLs rotated upstream, plus content/.metadata.json). Resolved to origin/main's newer fetch; a full fetcher run follows and regenerates both regardless.
First full run on top of the merge with main. Confirms the archive-integrity fixes hold against live upstream: - newly-gone 0, known-dead 94 (tombstones byte-stable), reaped 0 - Failed 1, and it is a transient TLS connect error on a single platform.claude.com page, not a breakage - 76 content files refreshed, 1 new page (claude/claude-tag/concepts/data-lifecycle.md) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ying
Two findings from a housekeeping sweep. Same root cause: the pipeline knew
things it had no way to tell anyone.
1. Discovery was written to a log with no reader.
`_report_offsite_redirects` already prints "<-- UNKNOWN DOMAIN, consider
adding a source" during every full run. In CI that is an Actions log
nobody opens, and the agent that decides whether a run is newsworthy
reads `git status`, not the step above it. So the pipeline printed
`support.claude.com -> academy.claude.com` four times a day for weeks
while a human eventually found those 725 pages by chasing a dead support
article. The signal existed; the path to a person did not.
Full runs now write `discovery.json`: per-domain capability, the set of
redirect targets seen, the anthropics repos we do and do not fetch, and
a `review` list of domains reachable-and-serving-markdown that nothing
fetches. A new source is now a diff, which the existing publish path
already turns into a PR — no new plumbing, and the workflow prompt
classifies any change to it as high signal.
`serves_markdown` is the field that carries the weight: it is the exact
test for whether this fetcher could archive a domain at all. It
independently re-derives today's answer (academy.claude.com: sitemap
yes, markdown no) and will flip the day that stops being true.
Probing detail worth keeping: sampling the *first* sitemap <loc> called
platform.claude.com and claude.com markdown-incapable, because their
first entries are the site root and a localised marketing page. It now
samples five doc URLs spread through the sitemap.
A `--discover` run observes no redirects, so it preserves the last full
run's `redirect_targets` instead of clearing them — otherwise a manual
probe would erase academy.claude.com and report it as good news.
2. content/.metadata.json still carried the number the console fix removed.
The dead/failed split landed in `_print_summary`, but `_save_metadata`
runs before it. The terminal said `Failed: 1 / 100.0% of 3810 live docs`
while the machine-readable artifact — the one a consumer would parse —
said `failed: 95, success_rate: 97.6`. That is rule 12's camouflage
surviving in the file: a rate pinned by 94 standing deaths cannot show
the 95th failure that is new.
The split moved into an idempotent `_finalize_stats()` both writers
call. The artifact also gains a `dead` list: known deaths matched
neither `items` (successes only) nor `failures` (status == "failed"),
so all 94 fell out of the file entirely while the summary still counted
them.
Verified on two consecutive full runs:
- Failed 0, Gone 94, tombstones byte-stable, reaped 0, 100.0% of 3810
- metadata now reads failed 0 / dead 94 / 100.0, with 94 dead entries
- discovery.json review [] and no UNKNOWN domains — correct today
- tripwire fired on purpose: injecting a redirect to an unlisted domain
probes it, marks it "UNKNOWN — seen only as a redirect target", adds
the review line, and prints the decision block
Also fixes two stale README claims found on the way: it advertised a
6-hourly schedule (the cron is 4x daily) and said blog/research/support
articles go through jina.ai for HTML-to-markdown — that path was removed
in 2026-07, which is the reason content/blog/ is frozen at all.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c86de1e2a5
ℹ️ 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".
| for p in paths[:20]: | ||
| print(f" would reap: {p}", file=sys.stderr) | ||
| print(f" ... +{len(paths) - 20} more", file=sys.stderr) | ||
| return 0 |
There was a problem hiding this comment.
Fail the run when the reap limit trips
When more than 200 markup files are queued for reaping, this branch prints an Actions error annotation but returns normally; fetch_all() then prints a summary and exits successfully. During the exact mass-soft-404 outage this circuit breaker is intended to detect, CI therefore remains green and can continue publishing the newly generated tombstones and partial results. Raise an exception or otherwise return a nonzero process status here.
Useful? React with 👍 / 👎.
| if not self._stats_finalized: | ||
| self._stats_finalized = True | ||
| self.stats["dead"] = len(self.dead_now) | ||
| self.stats["failed"] -= len(self.dead_now) | ||
| return self.stats["total"] - self.stats["dead"] |
There was a problem hiding this comment.
Preserve failures for explicit URL fetches
For fetcher.py URL, a 404, 410, or moved-page redirect increments failed and adds the URL to dead_now, but _save_metadata() calls this method before fetch_urls() tests self.stats["failed"]. Subtracting every death here consequently turns a single failed explicit fetch into failed == 0, so the command prints FAIL but exits successfully. Only complete archive runs should suppress known deaths, or the reporting count should be separated from the process exit status.
Useful? React with 👍 / 👎.
| "facts only: a change here is always news. `review` is the " | ||
| "actionable list — domains we could archive today and do not." | ||
| ), | ||
| "updated": datetime.now(timezone.utc).strftime("%Y-%m-%d"), |
There was a problem hiding this comment.
Remove the volatile date from discovery snapshots
On the first scheduled run of every UTC day, this field changes even when no domain capability, redirect target, or repository changed. That contradicts the snapshot's stated stable-facts-only contract and, more importantly, .github/workflows/fetch-claude-docs.yml classifies any discovery.json change as high signal requiring human review, so this creates a guaranteed spurious high-signal PR each day.
Useful? React with 👍 / 👎.
| targets = sorted({hop.split(" -> ")[1] for hop in self.redirects_offsite}) | ||
| if not targets: | ||
| try: | ||
| targets = json.loads( | ||
| self.discovery_path.read_text()).get("redirect_targets", []) |
There was a problem hiding this comment.
Let full runs clear stale redirect targets
When a full fetch observes no off-site redirects, targets is empty and this fallback restores the previous snapshot's targets, just as it does for --discover. Consequently, a domain that upstream stops redirecting to remains recorded forever as currently observed and potentially UNKNOWN; a later full run can never report or clear its disappearance. Preserve the old value only for the manual discovery mode, while full runs should write their observed empty set.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
This PR is a large archive-integrity maintenance and re-sync that (per the PR description) updates the fetcher so the on-disk archive stays correct over time (handling soft-404 HTML shells, de-indexed-but-live pages, redirects, and permanent “gone” URLs via tombstones), and makes discovery a tracked artifact (discovery.json) so newly-detected sources become reviewable diffs/PRs. The content changes shown in this diff reflect the resulting full sync: many documentation pages are added/removed/normalized, API reference pages are reformatted for consistency, and a number of support-article screenshot URLs are refreshed.
Changes:
- Refreshes/normalizes large portions of the docs corpus (including API reference pages across multiple SDKs/CLIs) and adds new claude.com product documentation pages.
- Removes a set of pages that appear to have been reaped/relocated upstream (several full-file deletions in this diff).
- Updates many support article embedded image URLs (expiring signed Intercom CDN links).
Reviewed changes
Copilot reviewed 115 out of 1836 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| content/support/9927533-disable-public-projects-for-your-organization.md | Refresh embedded screenshot URL. |
| content/support/9267400-move-your-personal-claude-account-to-a-team-or-enterprise-organization.md | Refresh embedded screenshot URL. |
| content/support/8325618-paid-plan-billing-faqs.md | Refresh embedded screenshot URL. |
| content/support/8114491-get-started-with-claude.md | Refresh embedded screenshot URL. |
| content/support/15936181-get-started-with-1password-for-claude.md | Refresh embedded screenshot URL. |
| content/support/15330088-set-a-default-model-for-your-organization.md | Refresh embedded screenshot URL. |
| content/support/14604416-get-started-with-claude-design.md | Refresh embedded screenshot URL. |
| content/support/14604406-claude-design-admin-guide-for-team-and-enterprise-plans.md | Refresh embedded screenshot URL. |
| content/support/14604397-set-up-your-design-system-in-claude-design.md | Refresh embedded screenshot URL. |
| content/support/14503775-mcp-web-search.md | Refresh embedded screenshot URL. |
| content/support/14479288-claude-cowork-desktop-architecture-overview.md | Remove page content (reaped/removed upstream). |
| content/support/13854387-schedule-recurring-tasks-in-claude-cowork.md | Refresh embedded screenshot URL. |
| content/support/13837433-manage-plugins-for-your-organization.md | Refresh embedded screenshot URL. |
| content/support/13756069-public-sector-faqs.md | Refresh embedded screenshot URL. |
| content/support/13371040-log-in-to-your-console-account.md | Refresh embedded screenshot URL. |
| content/support/13346458-customizing-your-console-appearance-settings.md | Refresh embedded screenshot URL. |
| content/support/13345190-get-started-with-claude-cowork.md | Refresh embedded screenshot URL. |
| content/support/13325567-account-management-faqs.md | Refresh embedded screenshot URL. |
| content/support/13189465-log-in-to-your-claude-account.md | Refresh embedded screenshot URL. |
| content/support/12997503-team-plan-billing-faqs.md | Refresh embedded screenshot URL. |
| content/support/12626668-use-quick-entry-with-claude-desktop-on-mac.md | Refresh embedded screenshot URL. |
| content/support/12512180-use-skills-in-claude.md | Refresh embedded screenshot URL. |
| content/support/12466728-troubleshoot-claude-error-messages.md | Refresh embedded screenshot URL. |
| content/support/12429409-manage-usage-credits-for-paid-claude-plans.md | Refresh embedded screenshot URL. |
| content/support/12293051-use-claude-in-xcode.md | Refresh embedded screenshot URL. |
| content/support/12260368-use-incognito-chats.md | Refresh embedded screenshot URL. |
| content/support/12157520-claude-code-usage-analytics.md | Refresh embedded screenshot URL. |
| content/support/12012173-get-started-with-claude-in-chrome.md | Refresh embedded screenshot URL. |
| content/support/11869629-use-claude-with-android-apps.md | Refresh embedded screenshot URL. |
| content/support/11818288-why-am-i-being-asked-to-verify-my-payment-method.md | Refresh embedded screenshot URL. |
| content/support/11725453-set-up-the-claude-lti-in-canvas-by-instructure.md | Refresh embedded screenshot URL. |
| content/support/10684626-enable-and-use-web-search.md | Refresh embedded screenshot URL. |
| content/support/10504853-manage-user-feedback-settings-on-claude-console.md | Refresh embedded screenshot URL. |
| content/support/10504844-manage-user-feedback-settings-on-team-and-enterprise-plans.md | Refresh embedded screenshot URL. |
| content/support/10310342-how-do-i-log-out-of-all-active-sessions.md | Refresh embedded screenshot URL. |
| content/mcp/docs/learn/versioning.md | Remove page content (reaped/removed upstream). |
| content/en/test-and-evaluate/strengthen-guardrails/keep-claude-in-character.md | Remove page content (reaped/removed upstream). |
| content/en/build-with-claude/prompt-engineering/prompt-generator.md | Remove page content (reaped/removed upstream). |
| content/en/api/typescript/messages/batches/delete.md | Normalize headings/signature/example formatting. |
| content/en/api/typescript/beta/webhooks/unwrap.md | Normalize headings/signature/example formatting. |
| content/en/api/ruby/messages/batches/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/ruby/beta/webhooks/unwrap.md | Normalize headings/example formatting. |
| content/en/api/python/messages/batches/delete.md | Normalize headings/signature/example formatting. |
| content/en/api/python/beta/webhooks/unwrap.md | Normalize headings/example formatting. |
| content/en/api/php/messages/batches/retrieve.md | Normalize headings/method casing/example formatting. |
| content/en/api/php/messages/batches/results.md | Normalize headings/method casing/example formatting. |
| content/en/api/php/messages/batches/list.md | Normalize headings/method casing; add parameter default note. |
| content/en/api/php/messages/batches/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/php/messages/batches/cancel.md | Normalize headings/method casing/example formatting. |
| content/en/api/php/completions/create.md | Add frontmatter metadata; keep “not available” notice. |
| content/en/api/php/beta/vaults/update.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/update.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/mcp_oauth_validate.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/create.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/credentials/archive.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/create.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/vaults/archive.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/user_profiles/create_enrollment_url.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/tunnels/reveal_token.md | Add full endpoint docs (was previously “not available”). |
| content/en/api/php/beta/skills/versions/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/versions/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/versions/download.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/versions/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/versions/create.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/list.md | Normalize headings/method casing; add parameter default note. |
| content/en/api/php/beta/skills/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/skills/create.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/resources/update.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/resources/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/resources/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/resources/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/resources/add.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/events/send.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/sessions/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/messages/batches/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/messages/batches/results.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/messages/batches/list.md | Normalize headings/method casing; add parameter default note. |
| content/en/api/php/beta/messages/batches/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/messages/batches/cancel.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/update.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memory_versions/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memory_versions/redact.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memories/update.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memories/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memories/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memories/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/memories/create.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/delete.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/create.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/memory_stores/archive.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/files/upload.md | Normalize headings/method casing; adjust return type naming in docs/example. |
| content/en/api/php/beta/files/retrieve_metadata.md | Normalize headings/method casing; adjust return type naming in docs/example. |
| content/en/api/php/beta/files/list.md | Normalize headings/method casing; add parameter default note; adjust return type naming. |
| content/en/api/php/beta/files/download.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/files/delete.md | Normalize headings/method casing; adjust return type naming in docs/example. |
| content/en/api/php/beta/environments/work/stats.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/environments/work/heartbeat.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/environments/retrieve.md | Normalize headings/method casing; clarify nullable description field; update example formatting. |
| content/en/api/php/beta/environments/delete.md | Normalize headings/method casing; normalize response schema wording; update example formatting. |
| content/en/api/php/beta/environments/create.md | Normalize headings/method casing; clarify nullable description field; update example formatting. |
| content/en/api/php/beta/environments/archive.md | Normalize headings/method casing; clarify nullable description field; update example formatting. |
| content/en/api/php/beta/deployments/run.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/deployment_runs/retrieve.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/deployment_runs/list.md | Normalize headings/method casing; update beta enum usage in example. |
| content/en/api/php/beta/agents/versions.md | Update endpoint docs/example payload for latest schema. |
| content/en/api/java/messages/batches/delete.md | Normalize headings/method casing/signature wording. |
| content/en/api/go/beta/webhooks/unwrap.md | Normalize headings/example formatting (go fmt style). |
| content/en/api/csharp/messages/batches/delete.md | Normalize headings/method casing/signature wording. |
| content/en/api/csharp/completions/create.md | Add frontmatter metadata; keep “not available” notice. |
| content/en/api/compliance/apps/chats/generated_files/content.md | Remove page content (reaped/removed upstream). |
| content/en/api/compliance/apps/chats/files/content.md | Remove page content (reaped/removed upstream). |
| content/en/api/compliance/apps/artifacts/content.md | Remove page content (reaped/removed upstream). |
| content/en/api/cli/messages/batches/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/vaults/retrieve.md | Normalize headings/method casing; improve schema annotations; normalize example fence language. |
| content/en/api/cli/beta/vaults/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/vaults/credentials/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/vaults/archive.md | Normalize headings/method casing; improve schema annotations; normalize example formatting. |
| content/en/api/cli/beta/user_profiles/create_enrollment_url.md | Normalize headings/method casing; improve schema annotations; normalize example formatting. |
| content/en/api/cli/beta/tunnels/rotate_token.md | Add full endpoint docs (was previously “not available”). |
| content/en/api/cli/beta/tunnels/reveal_token.md | Add full endpoint docs (was previously “not available”). |
| content/en/api/cli/beta/skills/versions/retrieve.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/skills/versions/list.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/skills/versions/download.md | Normalize headings/method casing; schema name normalization. |
| content/en/api/cli/beta/skills/versions/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/skills/versions/create.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/skills/retrieve.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/skills/list.md | Normalize headings/method casing; fix pagination param wording; normalize example formatting. |
| content/en/api/cli/beta/skills/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/skills/create.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/sessions/resources/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/sessions/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/messages/batches/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/memory_stores/memories/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/memory_stores/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/files/download.md | Normalize headings/method casing; schema name normalization. |
| content/en/api/cli/beta/files/delete.md | Normalize headings/method casing; response schema naming. |
| content/en/api/cli/beta/environments/work/stats.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/environments/work/heartbeat.md | Normalize headings/method casing/example formatting. |
| content/en/api/cli/beta/environments/delete.md | Normalize headings/method casing/example formatting. |
| content/en/api/beta/webhooks/unwrap.md | Normalize heading formatting. |
| content/claude/third-party/claude-desktop/claude-api.md | Add new claude.com product doc page. |
| content/claude/government/tenant-admin/configuration.md | Add new claude.com government doc page. |
| content/claude/government/org-admin/configuration.md | Add new claude.com government doc page. |
| content/claude/cowork/overview.md | Add new claude.com product doc page. |
| content/claude/connectors/building/after-publishing.md | Add new claude.com connectors doc page. |
| content/claude/claude-science/whats-not-available-yet.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/the-reviewer.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/overview.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/multiple-computers.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/monitor-usage.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/custom-connectors.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/cloud-storage.md | Add new claude.com Claude Science doc page. |
| content/claude/claude-science/annotations.md | Add new claude.com Claude Science doc page. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| $betaTunnelToken = $client->beta->tunnels->revealToken( | ||
| 'tunnel_id', betas: [AnthropicBeta::MESSAGE_BATCHES_2024_09_24] | ||
| ); |
Four commits, from a housekeeping sweep of the archive. Two were sitting
unpushed on a local branch; two are new.
What was wrong
The pipeline was healthy by every rule it had: green 4x/day, PRs merging,
main fresh. It was also quietly diverging from upstream, and every symptom
looked like success.
content/en/api/terraform/among themclaude.com/docswas never fetched at allcontent/.metadata.jsonreported the pre-fix numbersWhat changed
Commits 1-2 (previously unpushed) close 1-5: refetch the on-disk
inventory rather than trusting the index, record moves instead of writing
the target's body to the source's path, tombstone confirmed deaths so the
rate is computed over live docs, and let the archive shrink -- with a
200-file circuit breaker and a rule that only markup is deleted
automatically.
Commit 3 is a full sync on top of
main.Commit 4 closes 6-7:
discovery.jsonis now a tracked file rewritten by every full run --per-domain capability, redirect targets seen, anthropics repos fetched vs
not, and a
reviewlist of domains we could archive today and do not. Anew source becomes a diff, which the existing publish path already turns
into a PR. The workflow prompt classifies any change to it as high signal.
_finalize_stats()is now called by both the console and the metadatawriter, so the artifact stops reporting
failed: 95 / 97.6%for a runwhose real numbers are
0 / 100.0%. Known deaths matched neitheritemsnor
failuresand fell out of the file entirely; they now have their ownlist.
Verification
Three consecutive full runs before the merge, two after:
discovery.json:reviewempty, no UNKNOWN domains -- correct todayprobes it, marks it
UNKNOWN -- seen only as a redirect target, adds thereview line, and prints the decision block. It is a tripwire, not a
hypothesis.
Not in this PR
356 stale branchesCorrected after merge: that number wasmeasured from this clone's remote-tracking refs, and the clone had a
narrowed fetch refspec (
+refs/heads/main:refs/remotes/origin/main), so359 refs deleted on the remote long ago had never been pruned locally.
git ls-remoteand the branches API both said 20. All 20 wereno-PR-ever orphans from the June 2026 incident, all content-only (zero
non-content files in any diff vs main), and all have now been deleted --
the repo is down to
main. The "one branch per closed PR" mechanism Idescribed does not exist: 353 closed PRs left zero branches behind. The
orphan-producing failure is already instrumented by the Verify-outcome
step in this workflow, so no cleanup automation was added.
academy.claude.com(725 pages) still needs an HTML extraction path,which is a design decision, not a fetcher config change.
discovery.jsonnow holds the open question instead of a comment in
sources.json.🤖 Generated with Claude Code