diff --git a/plugins/knowledge/.claude-plugin/plugin.json b/plugins/knowledge/.claude-plugin/plugin.json index ffc913d3d..ad23b5ae8 100644 --- a/plugins/knowledge/.claude-plugin/plugin.json +++ b/plugins/knowledge/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "knowledge", - "version": "0.10.15", + "version": "0.10.16", "description": "Ingest external knowledge into durable, synthesized artifacts. Ships a book-distillation pipeline (PDF/EPUB into concept-organized, author-attributed skill reference files), a YouTube pipeline (watch, transcript, link harvest, and repo-applicability synthesis), a course-digest pipeline (extract and synthesize online video courses — Dometrain, Teachable — into repo-applicable recommendations), and a docpage-digest pipeline (single online documentation page into a verified knowledge slice with dual verification — one cross-vendor verifier — and an interview handoff), plus a re-runnable setup action; a configurable library directory governs where synthesized artifacts land in the consuming repo.", "author": { "name": "Melodic Software", diff --git a/plugins/knowledge/CHANGELOG.md b/plugins/knowledge/CHANGELOG.md index 265d48402..b234afc81 100644 --- a/plugins/knowledge/CHANGELOG.md +++ b/plugins/knowledge/CHANGELOG.md @@ -4,6 +4,46 @@ All notable changes to the `knowledge` plugin are recorded here. The `version` i `.claude-plugin/plugin.json` is the delivery vehicle — a consumer receives a change only after that version increases. +## [0.10.16] + +### Changed + +- **`docpage-digest` — a second batch of the campaign's evidence-forced amendments.** Same standard + as 0.10.15: each rule below was forced by a defect the pipeline's own runs produced, and each + states its evidence inline. Not the last batch — the two classes held below say why. +- **Anthropic profile — what falsifies `api-only`, written down once.** Only the corpus documenting + the claim's *own specific assertion* falsifies the tag; topical overlap never does. Below that + line sits the **near-miss** — a harness page covering the row's subject without stating its + specific rule: the tag survives, and the row must name the near-miss by page and line, so an + affirmative "no surface" or "undisclosed" phrasing in such a row is simply false. Undisclosed + near-misses were the largest MINOR class in the slice that measured them — one unit disclosed 24 + on its own — and the rule had been re-derived per unit rather than written down. +- **Anthropic profile — the two reproducible `claude.com/blog` extraction artifacts are recorded** + (H1 word-spacing collapse; reading-time value and unit split across lines) with reconstruction + from the canonical URL slug, labelled reconstructed because a slug recovers word boundaries only. + Both reproduced exactly across two blog runs, which is what the earlier deferral was waiting for. + +Two classes of item are deliberately **not** applied here, for two different reasons. + +Three change instruments that live in the campaign's untracked work root, not in the shipped plugin +— making the quote checker a required artifact (whose own precondition, unrecognized-row detection +erroring loudly, cannot be demonstrated as shipped), the command-replay gate reading only the first +number of a `→ N lines, M files` pair, and the absence-measurement script skipping positive rows. +Whether any of those graduates into the skill is a scope decision, not a forced one. + +Five more are held for the dispositions interview, having been reclassified out of this batch. The +campaign's triage marks each `evidence-forced`, but the judgment-amendments file writes all five up +as judgment calls with two named readings apiece — vendor-voice attestation for blog material +embedded in a non-blog page (J-6), splitting the two questions a positive tag's row collapses (J-7), +naming the publisher's `llms.txt` index as the page-selection instrument (J-8), the scope of +"harness surface" for counterpart artifacts and same-workload mentions (J-12), and the standing +convention for site-injected matter in a snapshot (J-14). That file's own reasoning governs: J-14 +says outright it is held "only because no defect was demonstrated, so the bar for the applied subset +is not met", and J-7 says it should be decided *after* the Decision-A ordering question already +escalated to the maintainer. All five now carry recommendations in the interview's decision block. +The contested tag-vocabulary questions therefore remain where 0.10.15 left them, and these five join +them: with the dispositions interview. + ## [0.10.15] ### Changed diff --git a/plugins/knowledge/skills/docpage-digest/context/anthropic-docs-profile.md b/plugins/knowledge/skills/docpage-digest/context/anthropic-docs-profile.md index 1643a2a79..7f7141f1e 100644 --- a/plugins/knowledge/skills/docpage-digest/context/anthropic-docs-profile.md +++ b/plugins/knowledge/skills/docpage-digest/context/anthropic-docs-profile.md @@ -13,7 +13,20 @@ A second publisher joins as a sibling profile file; engine extraction waits for (2026-07); **re-verify per doc** — precedent, not a guarantee. Fallback: fetch the rendered page and record the degradation. - **Blog posts (`claude.com/blog/...`):** no raw-markdown channel known; fetch rendered and - extract. Record the channel used. + extract. Record the channel used. **Two extraction artifacts reproduce on this channel; record + them, never repair them** — `source.*` is immutable, so the fix belongs in whatever reads the + snapshot, not in the snapshot. (a) The animated hero heading collapses every space in the H1. + Reconstruct the title from the canonical URL slug, which the checklist already records — but the + slug recovers word boundaries only, never punctuation or casing + (`claude-models-explained-choosing-the-best-model-for-your-use-case` cannot yield the colon in + "Claude models explained: choosing the best model for your use case"), so a title recovered that + way is labelled reconstructed. When the run also retained the rendered HTML, that file's + ``/`<h1>` carries the exact form — but nothing in the pipeline contracts such a file, so + it is a bonus, not the method. (b) The reading-time widget splits its value and its unit onto + separate physical lines, so neither line reads as a duration on its own. (Both observed + identically in two runs, at each slice's `source.md:7`: + `# Claudemodelsexplained:choosingthebestmodelforyourusecase` with the reading time at lines + 83/87, and `# BuildingverificationloopsinClaudeCodewithskills` with it at lines 45/49.) - **PDFs (model/system cards):** download the original binary as `source.pdf` plus a text extraction as `source.txt`; both are originals, the extraction tooling is named in the checklist. @@ -38,8 +51,9 @@ the tag asserts: without a live-doc check, is additionally recorded as `unverified-inference` and becomes an interview question, never a silent fact. (This rule exists because inference has already produced a wrong tag once — the failure mode is real.) -- **`api-only` (a negative claim — "no harness surface exists"):** absence cannot be proven from - one page. Record the basis (the harness doc section(s) checked, or `unverified-inference` when +- **`api-only` (a negative claim — "no harness surface exists" for the claim's own specific + assertion; see the near-miss rule below):** absence cannot be proven from one page. Record the + basis (the harness doc section(s) checked, or `unverified-inference` when none was); a contested or load-bearing `api-only` tag escalates to the interview rather than standing on an absence citation. **The basis records the exact command run and its raw result count**, not a prose summary of what was checked — an attested zero is not a reproducible zero, @@ -55,6 +69,17 @@ the tag asserts: still the most-violated rule in that slice; the cost is documented, not hypothetical — an undisclosed `settings.md:727` near-miss was exactly what the unread portion of a 199-line hit set contained.) +- **What falsifies `api-only`, and what only comes close — written down once, because the whole + class of defects here is the boundary being re-derived per row.** `api-only` asserts no harness + surface for **the claim's own specific assertion**, so only the corpus documenting *that + assertion* falsifies it; topical overlap never does. Below that falsifying line sits the + **near-miss** — a harness page covers the row's subject without stating the row's specific rule. + The tag survives, the row MUST name the near-miss by page and line (the term this profile already + uses of `settings.md:727` above), and an affirmative "no surface" or "undisclosed" phrasing in + such a row is simply false and goes. Silence here was the largest MINOR class in the slice that + measured it: one release-notes unit disclosed 24 near-miss rows on its own, and two sibling units + in that slice raised the same boundary independently, one of them asking outright for a standing + notation so a reader can tell "no surface at all" from "adjacent surface exists". - **`cc-applicable`/`mixed` boundary:** a claim that names an API surface (parameter, endpoint, SDK call) tags `mixed` even when its guidance transfers to the harness; `cc-applicable` is reserved for claims naming no API surface.