Skip to content

bankstatementparser.com 0.0.9 - #45

Merged
sebastienrousseau merged 6 commits into
mainfrom
feat/v0.0.9
Nov 1, 2026
Merged

sebastienrousseau merged 6 commits into
mainfrom
feat/v0.0.9

Conversation

@sebastienrousseau

Copy link
Copy Markdown
Owner

This PR fixes the Search Console indexing report by linking pages by their canonical URLs, keeping the sitemap to indexable canonical pages, and redirecting moved pages.

Google should stop finding duplicate URLs on the site, and the 483 not-indexed URLs (all left over from the 28-locale site removed in July) can now age out as clean 404s or redirects.

Highlights ⭐️

  • Canonical links everywhere: the header, footer and three pages linked to /page/index.html while every page canonicalises to /page/, which Search Console reports as "Alternative page with proper canonical tag". Every internal link now uses the canonical URL.
  • A sitemap Google can trust: scripts/post-build.py lists a page only if it is not noindex, not a redirect and is its own canonical. It still lists the same 18 live URLs, and each maps to a built file.
  • Moved pages redirect, dead links get our 404: /faq/ and /contribute/ (renamed to /faqs/ and /contributing/) now redirect through meta-refresh pages generated from config/redirects.json, and the 404 page is published at /404.html, the path GitHub Pages serves for missing URLs.
  • Hygiene: built with ssg 0.0.72, release titles follow bankstatementparser.com 0.0.9, and CI now enforces the complexity ceilings on every Python function.

What's Changed

Root cause: every sampled 5xx and 404 URL (/ha/a-propos/, /fr/, /contribute/index.html and the rest) comes from the multi-locale site that dae79d26 replaced on 2026-07-28. Its sitemap listed 364 URLs with /index.html canonicals, and its generator really did put French slugs under other locales. The current site is English-only by design, so /fr/ and the other locale pages are not missing from the build. They stay 404 because there is no same-language page to send them to. The 5xx responses could not be reproduced: every sample returns 404 today.

  • tests/test_site_urls.py checks the deployed docs/ tree: sitemap URLs, same-site URLs in every page, canonical internal links, redirect targets and /404.html.
  • tests/test_complexity.py adds radon 6.0.1 to the hash-pinned requirements/test.txt.
  • Not changed, needs a decision: ssg's ai-plugin.json points at /legal and /openapi.yaml, and mcp.json at /.well-known/mcp, none of which exist. Setting ai_plugin = false and [agents.mcp] enabled = false in ssg.toml would stop advertising them.

Validation

  • make verify (ssg 0.0.72): lint, regression tests and all 15 ssg audit gates pass with zero findings.
  • python -m pytest tests (CI requirements): 93 passed. The new URL test failed 23 cases on the main build before the fix. The complexity test failed on run_regression and validate before the refactor, and the release-title test failed against the old script.
  • npx html-validate@10 "docs/**/*.html", audit/contrast.py and the CI structure guardrails: clean.
  • Sitemap: 18 URLs, each mapped to a built index.html. Served locally, /faq/ and /contribute/index.html return the redirect page and /fr/ returns 404.
  • pip-audit -r requirements/test.txt: no known vulnerabilities.

Checksums

SHA-256 of the artifacts produced by python3 scripts/release_backfill.py --src . --tag v0.0.9 on this branch:

da523326a9c6a4c45af8e371d6ab975bf942a57b4f535ffbc419ba191018a269  bankstatementparser-site-v0.0.9.tar.gz
543670572682a0d10216c389eb12c6745f3f9218d9ae5cb1e3916a6a96f5a3ea  bankstatementparser-site-v0.0.9.cdx.json

Full Changelog: v0.0.8...feat/v0.0.9

sebastienrousseau and others added 6 commits November 1, 2026 18:13
The release workflow, devcontainer, AGENTS.md and DEVELOPMENT.md
pinned ssg 0.0.69 and the README badge named 0.0.63, while the
workspace rule is to build every ssg site with the latest release.
Move every pin to 0.0.72, the current release on crates.io. A local
build with 0.0.72 passes make verify with no template changes.

Assisted-by: Claude Code:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastien Rousseau <sebastienrousseau@users.noreply.github.com>
run_regression (cyclomatic 22, cognitive 38) and validate_readme's
validate (cyclomatic 13, cognitive 19) were over the workspace
ceilings, and nothing stopped new offenders. Split both into small
checks with identical output: an old-versus-new run on good and
mutated inputs gave byte-identical reports.

tests/test_complexity.py now fails CI when any function in scripts/,
tests/ or audit/ exceeds cyclomatic 10, Halstead difficulty 30 or 60
lines, or a file exceeds 500 lines. It failed on the two functions
before the split and passes after. No baseline is needed: there are
no remaining offenders (complexipy also reports cognitive <= 15).

requirements/test.txt is regenerated with uv pip compile
--generate-hashes to add radon 6.0.1 and its two dependencies,
colorama 0.4.6 and mando 0.7.1; existing pins are unchanged and
pip-audit reports no known vulnerabilities.

Assisted-by: Claude Code:claude-opus-5-5 radon complexipy pip-audit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastien Rousseau <sebastienrousseau@users.noreply.github.com>
scripts/release_notes.py titled releases "BSP v0.0.9" and fenced the
checksums without the "SHA-256 of every asset attached to this
release:" line or a text fence. The portfolio release format requires
"<project> <version>" with no leading v, which is why v0.0.8's title
had to be corrected by hand after publishing.

Title releases "bankstatementparser.com 0.0.9" and build the checksum
block in its own function. tests/test_release_notes.py covers both;
the title test fails against the previous script.

Fixes: 2ff6124
Assisted-by: Claude Code:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastien Rousseau <sebastienrousseau@users.noreply.github.com>
Every page canonicalises to its trailing-slash URL (/formats/), but
the header, footer, home page, FAQs and 404 page linked to the
/formats/index.html duplicate: 20 links on every page from the
header and footer, 28 on the home page. Search Console reports such
duplicates as "Alternative page with proper canonical tag", and
crawl budget goes on URLs that are never indexed.

Link to the canonical URL instead. tests/test_site_urls.py (next
commit) fails on all 20 built pages before this change and passes
after.

Fixes: 13c47db
Assisted-by: Claude Code:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastien Rousseau <sebastienrousseau@users.noreply.github.com>
Search Console reports 483 URLs not indexed against 33 indexed. All
sampled 5xx and 404 URLs come from the 28-locale site that dae79d2
replaced on 2026-07-28 (its sitemap listed 364 URLs, canonicals in
/page/index.html form), plus English pages it renamed: /faq/ is now
/faqs/ and /contribute/ is /contributing/. Today they all return
404, and the current sitemap lists only the 18 live pages.

Three generator changes in scripts/post-build.py:

- The sitemap keeps a page only if it is not noindex, not a redirect
  and is its own canonical, so no future page can advertise a URL
  Google will refuse. Before, any built HTML file was listed.
- config/redirects.json maps moved URLs to their new home; a
  meta-refresh page with a canonical to the target is written at
  each old URL, since GitHub Pages cannot send HTTP redirects.
- The 404 page is also published at /404.html, the path GitHub Pages
  serves for any missing URL; it was only at /404/, so dead links
  got GitHub's generic page.

Removed translations stay 404: the site has been English-only since
dae79d2 and has no same-language page to send them to.

tests/test_site_urls.py checks the deployed docs/ tree: every sitemap
URL maps to a built, indexable, self-canonical page; every same-site
URL in a page resolves; internal links avoid index.html; each
redirect lands on a built page; /404.html exists. It failed 23 cases
on the previous build and passes on this one. A unit test shows the
old collector listing noindex, redirect and non-canonical pages.

Fixes: dae79d2
Assisted-by: Claude Code:claude-opus-5-5 html-validate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastien Rousseau <sebastienrousseau@users.noreply.github.com>
Bump VERSION, CITATION.cff and the service worker cache name to
0.0.9, add the 0.0.9 CHANGELOG section and release Highlights, and
add the missing 0.0.8 and new 0.0.9 entries to the site changelog.

docs/ and public/ are regenerated with make build (ssg 0.0.72 and
scripts/post-build.py), not edited by hand. Beyond version strings
and build dates, the output changes are: canonical internal links on
every page, the /faq/ and /contribute/ redirect pages, /404.html,
and ssg 0.0.72's serialisation of the per-page rss.xml files.
sitemap.xml still lists the same 18 URLs.

Assisted-by: Claude Code:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Sebastien Rousseau <sebastienrousseau@users.noreply.github.com>
@sebastienrousseau
sebastienrousseau merged commit ad75f8a into main Nov 1, 2026
9 checks passed
@sebastienrousseau
sebastienrousseau deleted the feat/v0.0.9 branch November 1, 2026 21:44
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