Skip to content

Website: Phase 2 content, safety facts, layout fixes - #3

Merged
cajdata merged 12 commits into
mainfrom
website
Oct 5, 2026
Merged

cajdata merged 12 commits into
mainfrom
website

Conversation

@cajdata

@cajdata cajdata commented Oct 4, 2026

Copy link
Copy Markdown
Owner

No description provided.

…d.py links

site/sitegen/tools.py pins actionlint 1.7.12 and lychee 0.24.2 by version and by the sha256 each release publishes. It downloads each once into site/.cache, checks the archive's sha256 on every use, and compares the binary on disk with the checked archive's copy, so only verified bytes ever run. A download that fails or doesn't match is a clear error, and a copy that's already running doesn't block the next use.

python site/build.py links runs the pinned lychee over the built site, offline by default and with --online for external links, from inside site/dist so no lychee config in the repo can change what it checks. The workflow uses it in place of lychee-action, whose download wasn't hash-checked; it counts the same links as before. Tests cover the pinned version, a clean check of the built site, a broken link and a broken anchor on a nested page (the output must name them), and downloads or cached files that don't match their pins.

Dependabot can't see these pins; updating them is by hand, as the README says.
Lighthouse 13.5.0 scored 100 in all four categories on every indexable page, mobile and desktop; the 404 page's SEO 63 is its noindex on purpose. HTML had 0 errors, structured data 0 errors and 0 warnings, and the live link check found 0 broken links in 459. The Rich Results Test shows one valid SoftwareApplication item; its only note is the optional aggregateRating, which stays out because there are no real ratings.

lasto.dev is verified in Google Search Console and Bing Webmaster Tools, with the sitemap submitted to both. The deploy description now names the pinned lychee, and section 10 gains the search engine steps.
The Google site verification TXT record is in place at the apex, and Bing Webmaster Tools was imported from Search Console, so it has no record of its own. Rechecked every record against 1.1.1.1 after launch: all in place, no wildcard. The GitHub challenge row no longer says missing, the apex rule allows TXT records, and the takeover note is in the past tense.
…ages, truck test dates

- sitegen/appfacts.py reads the capture's timings and limits from drive.py, recorder.py,
  retention.py, and cli.py with ast, like the safety facts. Figures the docs give as whole
  numbers must be whole.
- The source reader refuses a constant bound again by any statement, or changed in place by
  the module or a function or class in it; a line it can't evaluate is skipped, and no
  arithmetic can crash or hang the build.
- Every lasto command and --option a page shows in rendered code must exist in cli.py, each
  option checked against the command it's shown with. The options per command come from
  build_parser, which must keep a shape the site reads exactly.
- /docs/ index, Docs in the nav, breadcrumbs with a BreadcrumbList. A docs page must sit at a
  path roadmap.toml reserves, and a phase's docs publish only once it's done.
- A live_tested date per phase: what the site says has run at the truck follows it, since a
  truck test comes before approval. Stale truck claims are flagged at each phase's test.
- Page dates follow data a page uses in Jinja, not the same word in prose. The site workflow
  runs when docs/architecture.md changes, and serve --watch watches everything the site reads.
Every pin number, wire color, and "pin N" in the chain figure comes from hardware.toml's DLC3
pins, keyed by signal, and the build fails if one it labels is missing. The caption and the
text list get the no-break rules, so PCAN-USB and K-line stay on one line.
- Roadmap: Phase 2 done, built 2026-09-29, tested at the truck through 2026-10-01, approved
  2026-10-01, and public, with what it delivered and what it handed on to Phases 3 and 4.
- Safety pages: updated for Phase 2's changes (the durable audit log on real hardware, held
  records on disk under lasto drive, passive capture at the truck, the new structural tests,
  the serial guard's wider review) and checked claim by claim against the code.
- /docs/passive-capture/: lasto drive, armed mode, storage, lasto log, the step D results, and
  0x025's steering angle layout, provisional pending Phases 3 and 5.
- Home: passive mode has recorded the truck's bus; the broadcast IDs row links the list.
The no-break rule kept every hyphenated word with a capital on one line, so Creader-assisted
and Read-only couldn't wrap, and the roadmap's first table ran 15 px into the margin at 375 px
(on the live site too). Now a hyphenated word stays together only when a part has a digit or
is all capitals (OBD-II, K-line, 2026-09-26). Below 360 px, table cells get narrower side
padding, so four-column tables fit at 320 px. More units (Hz, ms, s, MB, GB, kbit/s, minutes,
days) stay with their numbers.
On pages without section numbers (the roadmap), each contents entry sat in the empty 36 px
number column, so its text wrapped a word or two per line, on the live site too.
docs/website.md section 0e records the merges, the roadmap and Safety page updates, the
passive capture docs, the build changes, Chris's decisions (the PCAN-Basic version, 0x025's
byte order, coverage stated as gates, no scrubbed capture promised until one is published),
and the three-round pre-commit review. site/README.md covers capture facts, the per-command
CLI check, live_tested, reserved docs paths, the nobreak filter, and what serve --watch watches.
_member returned the tar member's file object after the `with` block had closed the archive,
so reading it raised "I/O operation on closed file". Only Linux takes the tar.gz assets, so CI
failed on PR #3 while every Windows run passed. The member is now read inside the block; the
zip path already was.

test_tools.py drives each path whichever machine runs it: a tar.gz and a zip from memory,
every pinned release archive for both systems (each must hold its binary, MZ or ELF), a fetch
into an empty cache that downloads, extracts, and sets the executable bit Linux needs, and a
full build from an empty cache (the social-image fonts and images CI always renders).
@cajdata
cajdata merged commit e229cf3 into main Oct 5, 2026
2 checks passed
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