| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| provenance:programming:crawler:foxhound [2026/08/17 17:56] – Record the figures-and-code re-review: the UTF-16 offset false negative and the iframe.srcdoc gap (both fixed), the confirmed weak needle, the byte-vs-code-point unit error, and a process defect on my side — reviewers were handed files that changed under karel.kubicek.claude | provenance:programming:crawler:foxhound [2026/09/17 07:41] (current) – Markup rendering sweep correction: escape residual CLI flags. Authored by Claude. karel.kubicek.claude |
|---|
| Three separate checks, all in the report: | Three separate checks, all in the report: |
| |
| * **Schema evidence quotes** (section G): the 9 ''tools[].evidence.quote'' values, normalised for whitespace and line-break hyphens, then by five-word windows — **5 exact, 4 partial (≥60% of windows), 0 below threshold, 0 without full text.** The four partials are column splices in the repaired rendering, not unsupported claims. Cross-checked with the shared bulk verifier, which is a separate implementation: ''node scripts/quote_check.mjs --tools 'fox.?hound' --show'' returns the identical 5/4/0/0. | * **Schema evidence quotes** (section G): the 9 ''tools[].evidence.quote'' values, normalised for whitespace and line-break hyphens, then by five-word windows — **5 exact, 4 partial (≥60% of windows), 0 below threshold, 0 without full text.** The four partials are column splices in the repaired rendering, not unsupported claims. Cross-checked with the shared bulk verifier, which is a separate implementation: ''node scripts/quote_check.mjs %%--tools%% 'fox.?hound' %%--show%%'' returns the identical 5/4/0/0. |
| * **Hand deciding quotes** (also section G): the 13 sentences in the ''ROLE'' map — **13 exact, 0 not exact**, as the report says. Two of them are exact only because they were //shortened// during this run to a contiguous fragment: the CCS 2025 extension sentence and the NDSS 2026 baseline sentence are each spliced across two columns in ''paper.cols.txt'', and the longer versions I first wrote matched at 50% and 60%. Both are marked with an inline comment in ''fh_fold.mjs'' saying why they are short, so a later reader does not "restore" them. (An earlier draft of this page said "11 exact, 2 not", describing the state before the shortening; the citations reviewer caught the mismatch against the artefact.) | * **Hand deciding quotes** (also section G): the 13 sentences in the ''ROLE'' map — **13 exact, 0 not exact**, as the report says. Two of them are exact only because they were //shortened// during this run to a contiguous fragment: the CCS 2025 extension sentence and the NDSS 2026 baseline sentence are each spliced across two columns in ''paper.cols.txt'', and the longer versions I first wrote matched at 50% and 60%. Both are marked with an inline comment in ''fh_fold.mjs'' saying why they are short, so a later reader does not "restore" them. (An earlier draft of this page said "11 exact, 2 not", describing the state before the shortening; the citations reviewer caught the mismatch against the artefact.) |
| * **Per-paper figures and quoted sentences used on the page** (section H): **50 needles, 0 not located** verbatim in ''paper.cols.txt''. This check exists because ''detection[].prevalence'' is a model summary rather than a quotation — the same reason ''verify_requests_figures.mjs'' exists. It started at 31 needles and grew to 50 on the figures reviewer's finding that the comparison table's per-tool numbers were disclosed as hand-checked but not machine-checked; adding them also caught three of my own needles that were column-spliced and would have read as failures. | * **Per-paper figures and quoted sentences used on the page** (section H): **50 needles, 0 not located** verbatim in ''paper.cols.txt''. This check exists because ''detection[].prevalence'' is a model summary rather than a quotation — the same reason ''verify_requests_figures.mjs'' exists. It started at 31 needles and grew to 50 on the figures reviewer's finding that the comparison table's per-tool numbers were disclosed as hand-checked but not machine-checked; adding them also caught three of my own needles that were column-spliced and would have read as failures. |
| | 6.1 GiB checkout, GPL-3.0, repo created 2021-06-04 | GitHub repos API | API fetch | | | 6.1 GiB checkout, GPL-3.0, repo created 2021-06-04 | GitHub repos API | API fetch | |
| | TU Braunschweig hosts 31 per-commit Linux builds under Debian Bookworm, newest ''1bb8dbd6'' (2026-05-19), with SHA-256 checksums and the matching Playwright version | [[https://foxhound.ias.tu-bs.de/|foxhound.ias.tu-bs.de]] | HTML fetch with a browser User-Agent, then regex extraction of commits, dates and Playwright versions | | | TU Braunschweig hosts 31 per-commit Linux builds under Debian Bookworm, newest ''1bb8dbd6'' (2026-05-19), with SHA-256 checksums and the matching Playwright version | [[https://foxhound.ias.tu-bs.de/|foxhound.ias.tu-bs.de]] | HTML fetch with a browser User-Agent, then regex extraction of commits, dates and Playwright versions | |
| | ''report.detail'' field list; the worked taint-flow JSON; "one release behind Playwright"; the gkrust OOM; the Playwright patch workflow constraints; the git-history resync | the project wiki, cloned as a git repository (''project-foxhound.wiki.git'') and the README | ''git clone --depth 1'', then read; the probe asserts nine specific README substrings still exist | | | ''report.detail'' field list; the worked taint-flow JSON; "one release behind Playwright"; the gkrust OOM; the Playwright patch workflow constraints; the git-history resync | the project wiki, cloned as a git repository (''project-foxhound.wiki.git'') and the README | ''git clone %%--depth%% 1'', then read; the probe asserts nine specific README substrings still exist | |
| | The JIT / best-effort caveat | ''taint/docs/TaintFlow.md'' on ''main'' | raw fetch, and the probe greps the two sentences | | | The JIT / best-effort caveat | ''taint/docs/TaintFlow.md'' on ''main'' | raw fetch, and the probe greps the two sentences | |
| | Klein et al., EuroS&P 2022 is the requested citation | README ''Cite us!'' section | probe asserts the BibTeX key ''KleBarBen'' is still present | | | Klein et al., EuroS&P 2022 is the requested citation | README ''Cite us!'' section | probe asserts the BibTeX key ''KleBarBen'' is still present | |
| </code> | </code> |
| |
| The copy embedded in the page's ''<file python>'' block was byte-compared against ''pages/foxhound_flows.py'' before publication (24,456 bytes each, identical — a real ''wc -c'' byte count, not Python's ''len()'', which counts code points and was what an earlier draft printed), because a published script that has drifted from the one that was tested is worse than no script: | The copy embedded in the page's ''%%<file python>%%'' block was byte-compared against ''pages/foxhound_flows.py'' before publication (24,456 bytes each, identical — a real ''wc -c'' byte count, not Python's ''len()'', which counts code points and was what an earlier draft printed), because a published script that has drifted from the one that was tested is worse than no script: |
| |
| <code bash> | <code bash> |
| </code> | </code> |
| |
| ''check_page_numbers.mjs'' passes both windowed and whole-page, and with ''--code''. Getting it to pass required a ''Z2'' block in the report listing every literal on the page whose source is not the corpus — the build minutes, the version pins, the pref counts, the per-paper figures from cited papers, and the tokenizer artefacts (''22.04'' yielding ''2.0''; the line numbers inside the fixture JSON). That block is the audit trail for every number the corpus cannot account for, and it is why the guard is a guard rather than a formality. | ''check_page_numbers.mjs'' passes both windowed and whole-page, and with ''%%--code%%''. Getting it to pass required a ''Z2'' block in the report listing every literal on the page whose source is not the corpus — the build minutes, the version pins, the pref counts, the per-paper figures from cited papers, and the tokenizer artefacts (''22.04'' yielding ''2.0''; the line numbers inside the fixture JSON). That block is the audit trail for every number the corpus cannot account for, and it is why the guard is a guard rather than a formality. |
| |
| ''check_attributions.mjs'' reported "0 attributions checked" against this page on first run, because its regex required the crawler-page style ''%%| Name et al., VENUE YEAR, //Title// {[key]} |%%'' and this page's tables omit the title. The regex was generalised to accept either form; both this page (9 attributions) and ''programming:crawler:pagegraph'' (8) pass afterwards. **"0 checked" is not a pass** — the guard says so itself, and this is the second page on which that message was the actual finding. | ''check_attributions.mjs'' reported "0 attributions checked" against this page on first run, because its regex required the crawler-page style ''%%| Name et al., VENUE YEAR, //Title// {[key]} |%%'' and this page's tables omit the title. The regex was generalised to accept either form; both this page (9 attributions) and ''programming:crawler:pagegraph'' (8) pass afterwards. **"0 checked" is not a pass** — the guard says so itself, and this is the second page on which that message was the actual finding. |
| | Distinct citekeys on the content page | **16**, all resolving | | | Distinct citekeys on the content page | **16**, all resolving | |
| | Reference list at the foot of the content page | **16 entries**, each with author list, venue and a DOI or venue URL | | | Reference list at the foot of the content page | **16 entries**, each with author list, venue and a DOI or venue URL | |
| | ''<WRAP important>'' boxes | 5, all rendered as boxes | | | ''%%<WRAP important>%%'' boxes | 5, all rendered as boxes | |
| | Footnotes | 20 | | | Footnotes | 20 | |
| | Tables | 10 on the content page, 8 here | | | Tables | 10 on the content page, 8 here | |
| | ''%%{[key]}%%'' written as a literal example here | escaped with ''%%%%'', renders as text | | | ''%%{[key]}%%'' written as a literal example here | escaped with ''%%%%'', renders as text | |
| | Unfilled double-brace marker slots in this page | 0 — and ''scripts/build_provenance_foxhound.py'' refuses to build if a slot has no content. It fired on the first draft of this very row, which wrote the marker syntax out literally; that is the guard working, and the row is now phrased so it cannot trip it | | | Unfilled double-brace marker slots in this page | 0 — and ''scripts/build_provenance_foxhound.py'' refuses to build if a slot has no content. It fired on the first draft of this very row, which wrote the marker syntax out literally; that is the guard working, and the row is now phrased so it cannot trip it | |
| | Both ''<file text>'' blocks | render as downloadable snippets with the full output inline | | | Both ''%%<file text>%%'' blocks | render as downloadable snippets with the full output inline | |
| | Reachability | the content page was already linked from ''programming:crawler'' and ''privacy:javascript'' before it existed, so no new inbound link was needed; the two pages link each other, and this one links [[literature:corpus]] | | | Reachability | the content page was already linked from ''programming:crawler'' and ''privacy:javascript'' before it existed, so no new inbound link was needed; the two pages link each other, and this one links [[literature:corpus]] | |
| |
| |
| <bibtex bibliography></bibtex> | <bibtex bibliography></bibtex> |
| | |
| | ===== 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. |
| |