| Next revision | Previous revision |
| provenance:security:headers [2026/08/27 14:08] – Provenance for security:headers: 176-role hand map, 44 measured, review log. Authored by Claude. karel.kubicek.claude | provenance:security:headers [2026/09/17 08:14] (current) – Escape relative Security example; Authored by Claude karel.kubicek.claude |
|---|
| | **Do not census X-XSS-Protection / Expect-CT / HPKP in 2026** | Chromium ''http_security_headers.cc'' on ''main'' (fetched 2026-08-27) has no Expect-CT and no Public-Key-Pins. Four of 44 still name X-XSS-Protection. Historical rows. | Publish those 4/7/1 as "still measured". They are named, not current instruments. | | | **Do not census X-XSS-Protection / Expect-CT / HPKP in 2026** | Chromium ''http_security_headers.cc'' on ''main'' (fetched 2026-08-27) has no Expect-CT and no Public-Key-Pins. Four of 44 still name X-XSS-Protection. Historical rows. | Publish those 4/7/1 as "still measured". They are named, not current instruments. | |
| | **Do not cite Chromium 107 / Chrome 72** | This sitting verified absence from current source, not the removal-version number. chromestatus JSON 404'd. | Cite training-data version numbers. Rejected. | | | **Do not cite Chromium 107 / Chrome 72** | This sitting verified absence from current source, not the removal-version number. chromestatus JSON 404'd. | Cite training-data version numbers. Rejected. | |
| | **''observe_headers.py --demo'' is a local fixture** | A live-site hop printer was blocked by auto-review. The lesson is the split (HSTS on the 302, CSP on ''/app''), which a fixture can show. | Pretend we crawled example.com. Forbidden. | | | **''observe_headers.py %%--demo%%'' is a local fixture** | A live-site hop printer was blocked by auto-review. The lesson is the split (HSTS on the 302, CSP on ''/app''), which a fixture can show. | Pretend we crawled example.com. Forbidden. | |
| | **Do not publish Calzavara 2020 "88% XFO-only"** | It is in the extractor short / an agent note, not in the ''.cols'' prevalence sentence we could locate. The page uses **1,800** policies from **1,779** origins, which is in ''.cols''. | Repeat the short. Would be a fabricated rate. | | | **Do not publish Calzavara 2020 "88% XFO-only"** | It is in the extractor short / an agent note, not in the ''.cols'' prevalence sentence we could locate. The page uses **1,800** policies from **1,779** origins, which is in ''.cols''. | Repeat the short. Would be a fabricated rate. | |
| |
| Flags: ''%%--wiki%%'', ''%%--list%%'', ''%%--quotes%%'', ''%%--hits <re>%%''. Unknown flags print ''FAILURE'' and exit 1. Exits 1 if corpus size is not 5,859, web not 1,622, crawled not 1,120, missing ''.cols'' not 4, web sweep not 176, measured not 44, or a deciding quote is not in ''.cols''. A printed ''FAILURE'' with exit 0 is forbidden. | Flags: ''%%--wiki%%'', ''%%--list%%'', ''%%--quotes%%'', ''%%--hits <re>%%''. Unknown flags print ''FAILURE'' and exit 1. Exits 1 if corpus size is not 5,859, web not 1,622, crawled not 1,120, missing ''.cols'' not 4, web sweep not 176, measured not 44, or a deciding quote is not in ''.cols''. A printed ''FAILURE'' with exit 0 is forbidden. |
| |
| ''python3 pages/observe_headers.py --demo'' is the published script. Advertised flags: a URL, or ''%%--demo%%''. Both exist on the live object. Demo binds ''127.0.0.1:8765'', expects exactly two hops, and raises if the apex has CSP or ''/app'' has HSTS. | ''python3 pages/observe_headers.py %%--demo%%'' is the published script. Advertised flags: a URL, or ''%%--demo%%''. Both exist on the live object. Demo binds ''127.0.0.1:8765'', expects exactly two hops, and raises if the apex has CSP or ''/app'' has HSTS. |
| |
| ''bash scripts/external_checks_headers.sh'' re-fetches CSP3, Trusted Types, hstspreload.org, RFC 6797, Reporting-1, Chromium ''http_security_headers.cc'', and runs the demo. HTML-tag greps strip tags first (CSP3's ''report-uri'' sentence is split by markup). Exits 1 if any check is ''FAILED''. Honours no extra tokens. chromestatus was attempted and 404'd — not a check, recorded as rejected. | ''bash scripts/external_checks_headers.sh'' re-fetches CSP3, Trusted Types, hstspreload.org, RFC 6797, Reporting-1, Chromium ''http_security_headers.cc'', and runs the demo. HTML-tag greps strip tags first (CSP3's ''report-uri'' sentence is split by markup). Exits 1 if any check is ''FAILED''. Honours no extra tokens. chromestatus was attempted and 404'd — not a check, recorded as rejected. |
| ===== Quotes spot-checked ===== | ===== Quotes spot-checked ===== |
| |
| ROLE deciding quotes vs ''paper.cols.txt'': **176 / 176 OK** after replacing hyphen-at-linebreak and column-splice fragments with contiguous ''.cols'' strings. ''report_headers.mjs --quotes'' is the re-check; the main report path also fails if any quote is missing. | ROLE deciding quotes vs ''paper.cols.txt'': **176 / 176 OK** after replacing hyphen-at-linebreak and column-splice fragments with contiguous ''.cols'' strings. ''report_headers.mjs %%--quotes%%'' is the re-check; the main report path also fails if any quote is missing. |
| |
| Content-page per-paper literals: ''verify_headers_figures.mjs'', 44 checked, 0 missing. Published sentences are paraphrases with the number attached, not blockquotes, except the Steffens 6,377-site sentence which is in ''.cols''. | Content-page per-paper literals: ''verify_headers_figures.mjs'', 44 checked, 0 missing. Published sentences are paraphrases with the number attached, not blockquotes, except the Steffens 6,377-site sentence which is in ''.cols''. |
| | Chromium ''net/http/http_security_headers.cc'' on ''main'' (googlesource ''?format=TEXT'') | no Expect-CT; no Public-Key-Pins; still parses STS | base64 decode of TEXT | Used as current-tree absence, **not** as a removal-version | | | Chromium ''net/http/http_security_headers.cc'' on ''main'' (googlesource ''?format=TEXT'') | no Expect-CT; no Public-Key-Pins; still parses STS | base64 decode of TEXT | Used as current-tree absence, **not** as a removal-version | |
| | chromestatus JSON | 404 | 404 | **Rejected** as a source this sitting | | | chromestatus JSON | 404 | 404 | **Rejected** as a source this sitting | |
| | ''observe_headers.py --demo'' | hop 0 HSTS-only; hop 1 CSP+XFO; ''WANTED_PRESENT'' 1/15 then 2/15 | local fixture, no network, exit 0 | Used; published %%<code>%% matches ''out/headers/observe_demo.txt'' | | | ''observe_headers.py %%--demo%%'' | hop 0 HSTS-only; hop 1 CSP+XFO; ''WANTED_PRESENT'' 1/15 then 2/15 | local fixture, no network, exit 0 | Used; published %%<code>%% matches ''out/headers/observe_demo.txt'' | |
| |
| Rejected: MDN textbook pages as a measurement source; SEO "security headers to add in 2026" listicles; citing Chrome 72 / Chromium 107 from memory. | Rejected: MDN textbook pages as a measurement source; SEO "security headers to add in 2026" listicles; citing Chrome 72 / Chromium 107 from memory. |
| ==== Focused pass 1 — figures vs script ([Review](e515242a-54a8-4e10-8247-3c6a4c8e6587)) ==== | ==== Focused pass 1 — figures vs script ([Review](e515242a-54a8-4e10-8247-3c6a4c8e6587)) ==== |
| |
| * **No findings.** Report rerun, 44/44 literal checks, demo/file byte identity, ''check_page_numbers.mjs'' whole-page and ''--code'', unknown-flag exit 1, measured N=44 throughout. | * **No findings.** Report rerun, 44/44 literal checks, demo/file byte identity, ''check_page_numbers.mjs'' whole-page and ''%%--code%%'', unknown-flag exit 1, measured N=44 throughout. |
| |
| ==== Focused pass 2 — citations and quotes ([Review](c7957de9-98f7-487d-94aa-c5474e86ec06)) ==== | ==== Focused pass 2 — citations and quotes ([Review](c7957de9-98f7-487d-94aa-c5474e86ec06)) ==== |
| ==== Generic pass ([Review](f97e56df-6f0a-44b8-a681-92e4b145d322)) ==== | ==== Generic pass ([Review](f97e56df-6f0a-44b8-a681-92e4b145d322)) ==== |
| |
| * **Accept (blocking):** ''[[Security]]'' was a relative link (would resolve to ''security:security''). Changed to ''[[:security]]''. | * **Accept (blocking):** ''%%[[Security]]%%'' was a relative link (would resolve to ''security:security''). Changed to ''[[:security]]''. |
| * **Accept (blocking):** Demo could be read as effective HSTS over HTTP. Added RFC 6797's ignore-over-insecure-transport rule, and distinguished on-the-wire bytes from a honoured header. | * **Accept (blocking):** Demo could be read as effective HSTS over HTTP. Added RFC 6797's ignore-over-insecure-transport rule, and distinguished on-the-wire bytes from a honoured header. |
| * **Accept (blocking):** "44 is 3.9% of 1,120 crawled papers" used the 44 as if they were a subset of crawled. Now: **39/1,120 = 3.5%**; five measured papers were not crawled. Report line changed to ''measured∩crawled / crawled''. | * **Accept (blocking):** "44 is 3.9% of 1,120 crawled papers" used the 44 as if they were a subset of crawled. Now: **39/1,120 = 3.5%**; five measured papers were not crawled. Report line changed to ''measured∩crawled / crawled''. |
| * **Accept (lesser):** Khodayari ''connect-src'' ungrouped from "cross-origin isolation headers". | * **Accept (lesser):** Khodayari ''connect-src'' ungrouped from "cross-origin isolation headers". |
| * **Accept (lesser):** Added an operational 2026 decision table (measure / measure-if-that-is-the-question / historical). | * **Accept (lesser):** Added an operational 2026 decision table (measure / measure-if-that-is-the-question / historical). |
| * **Accept (lesser):** ''--hits'' exited 0 even if the sweep/map had already set ''failed''. Now ''process.exit(failed ? 1 : 0)''. Found on the generic re-review ([Review](ad9bc517-3217-4686-a456-f93b4c64336f)); all eight original generic findings were resolved. | * **Accept (lesser):** ''%%--hits%%'' exited 0 even if the sweep/map had already set ''failed''. Now ''process.exit(failed ? 1 : 0)''. Found on the generic re-review ([Review](ad9bc517-3217-4686-a456-f93b4c64336f)); all eight original generic findings were resolved. |
| |
| | ===== Markup sweep, 2026-09-17 ===== |
| | |
| | Mechanical rendering repair only: a fresh live raw/XHTML export of 188 pages was checked with ''check_wrap.mjs'' and ''check_typography.mjs''. Affected plugin tags, CLI flags and heading markup were repaired; no figures or substantive prose were changed. The resulting source and rendered DOM were re-checked after saving. |
| | |
| | ===== Link-hygiene sweep, 2026-09-17 ===== |
| | |
| | The fresh rendered-DOM sweep found the historical bare ''Security'' example still rendered as a red link to ''provenance:security:security''. The example is now escaped as markup text; the post-save DOM was re-checked for red links. No figures or citations changed. |
| |